0

我查看了 x86/i64 文档,找不到他们提到 (%rip) 使用指令缓存的地方。因此,我不能 100% 确定是这种情况。

我想知道我是否正确。如果是这样,我想做的是使用 RIP 访问 4KB 缓冲区,因为访问它的代码非常小(嗯,小到足以容纳额外的 4000 字节。)我知道如何用 g++ 做到这一点,但我还没有看到用 cl 做到这一点的方法。这是我非常感谢学习的另一件事!

使用 g++,我可以编写如下内容:

__asm__ __volatile__ (".align 4                       \n\r"
                      ".big_num:                      \n\r"
                      ".long 0x01020304               \n\r"
                      ".long 0x05060708               \n\r"
                      ".long 0x01020304               \n\r"
                      ".long 0x05060708               \n\r"
                      "movdqa .big_num(%rip), xmm0    \n\r");

Microsoft 程序中的等价物是什么?

__asm {
  mov big_number(%rip), xmm7
  jmp loop
big_number:
  ???
loop:
}

----- 更新(2013 年 1 月 24 日)

实际上,RIP 寻址模式仅限于偏移量:

mov offset(%rip), reg

所以它对我没有帮助,因为我需要一个索引,如下所示:

mov offset(%rip, %eax, 4), reg

无论如何这是不可能的。

4

1 回答 1

3

据我了解英特尔手册所说和描述的内容,指令高速缓存用于指令本身(当它们从更远的高速缓存(L2 和 L3)并最终从主存储器中获取时)以及在指令内部编码的数据。

指令缓存可能会吸入代码中嵌入的一些数据,因为缓存行的粒度为 32/64 字节。但这可能没有用,因为您的 mov 指令正在访问的数据将通过不同的路线来自数据缓存。

总结一下:

  • L1缓存包含两个独立的部分:L1指令缓存和L1数据缓存。
  • L2 缓存是代码和数据的统一缓存。
  • L3也统一为L2。

如果 L1 IC 和 L1 DC 都从 L2 中的同一个地方拉取东西,那么您可能能够为 L2 中的一些表带来更长的寿命,但仅此而已。您将无法实际将数据移动到 L1 指令高速缓存中。

于 2013-01-22T10:09:20.827 回答