x86指令如何与L1和L2缓存交互以读写内存数据?

4

假设我在x86指令中有这样的一条指令,它想从内存地址读取数据。

mov eax, word_123456

假设这将从内存中获取数据。现在假设我将其存储。
mov word_123456, eax

我知道从CPU架构图上看,随机存储器和CPU之间都有缓存存在。如果我要求将寄存器中的内容存储到内存中,它是否总是会先进入L1缓存?谁决定它最终进入哪个缓存?另外,我想知道是否可以编写提示x86命令,以指定移动操作是应存储在缓存中还是将成为罕见的读/写等操作。


1
这高度取决于特定系统细节,即使在x86系列内部,因为缓存架构已经改变并将继续改变。一些缓存是写回vs写直通。有些是包容性的vs独占性的,分配vs非分配的。缓存行替换算法不同等等...简而言之,没有一个确切的系统参考,这个问题就没有一个标准答案。 - twalberg
1个回答

2
默认情况下,所有数据都会进入L1和L2缓存。(在原子访问方面稍微简化一下,但如果只是执行mov指令,那就是这样处理的。)它不是真正意义上的先进入L1缓存,而是一旦将其读入寄存器中后,缓存行也被缓存在其中,以备后续使用。
(我这里还有一些与体系结构相关的信息。某些体系结构选择使两个缓存互斥,因此从L2缓存中移除L2缓存行以将其放入L1缓存中。但这对代码性能影响不大,因为L2缓存比L1缓存大得多。这更像是一个簿记问题。)
L2缓存的目的是比L1缓存更大,以便如果某些数据在L1缓存中但已被驱逐,希望该数据仍然在L2缓存中,这样就不需要到达RAM。
是的,您可以提示写操作跳过缓存。例如,这就是movnti的用途。但不要为所有只写访问手动使用movnti。实际的性能收益很小,即使当前函数没有从内存中读取,也有很大可能某些其他即将执行的代码会读取它们。

大多数情况下,它由操作系统设置的页面表和页面属性表进行配置。您可以拥有具有不同内存类型的不同页面--未缓存、强制未缓存、写回、写穿透、写组合。请参见IA32手册第3卷 - Chris Dodd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接