Caching 使用mov(%rip)、%eax等指令时使用哪个缓存?
我查看了x86/i64文档,没有找到他们提到(%rip)使用指令缓存的地方。因此,我不能100%确定情况是否如此 我想知道我是否是对的。如果是这样,我想做的是使用RIP访问4KB缓冲区,因为访问它的代码非常小(好吧,小到足以容纳额外的4000字节)。我知道如何使用g++,但我还没有看到使用cl的方法。这是我非常希望学习的另一件事 使用g++我可以编写如下内容:Caching 使用mov(%rip)、%eax等指令时使用哪个缓存?,caching,assembly,x86,Caching,Assembly,X86,我查看了x86/i64文档,没有找到他们提到(%rip)使用指令缓存的地方。因此,我不能100%确定情况是否如此 我想知道我是否是对的。如果是这样,我想做的是使用RIP访问4KB缓冲区,因为访问它的代码非常小(好吧,小到足以容纳额外的4000字节)。我知道如何使用g++,但我还没有看到使用cl的方法。这是我非常希望学习的另一件事 使用g++我可以编写如下内容: __asm__ __volatile__ (".align 4 \n\r"
__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");
在微软的程序中,什么是等效的
__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
无论如何,这是不可能的。据我所知,英特尔手册中的说明和描述,指令缓存用于指令本身(当指令从较远的缓存(L2和L3)以及最终从主存获取时)以及指令内部编码的数据 指令缓存可能会吸收代码中嵌入的一些数据,因为缓存线的粒度为32/64字节。但这可能是无用的,因为mov指令正在访问的数据将通过不同的路径来自数据缓存 总而言之:
- 一级缓存包含两个独立的部分:一级指令缓存和一级数据缓存
- 二级缓存是代码和数据的统一缓存
- L3也统一为L2
若L1 IC和L1 DC都从L2中的同一位置提取数据,那个么L2中的一些表的寿命可能会更长,但仅此而已。您将无法实际将数据移动到一级指令缓存中。据我所知,指令缓存用于指令本身(当指令从较远的缓存(二级和三级)中提取,最终从主存中提取时)以及指令内部编码的数据 指令缓存可能会吸收代码中嵌入的一些数据,因为缓存线的粒度为32/64字节。但这可能是无用的,因为mov指令正在访问的数据将通过不同的路径来自数据缓存 总而言之:
- 一级缓存包含两个独立的部分:一级指令缓存和一级数据缓存
- 二级缓存是代码和数据的统一缓存
- L3也统一为L2
若L1 IC和L1 DC都从L2中的同一位置提取数据,那个么L2中的一些表的寿命可能会更长,但仅此而已。您将无法实际将数据移动到一级指令缓存中。最接近您的可能是
\u emit
,但在我看来,这似乎是“错误的”,我建议您使用《英特尔优化指南》第7章中描述的技术:乍一看,我会说这是内存加载,它将通过数据缓存。最接近的可能是\u emit
,但在我看来,这似乎是“错误的”,我建议使用《英特尔优化指南》第7章中描述的技术:乍一看,我会说这是内存加载,它将通过数据缓存。