假设我在x86中有这样的指令想从内存中的地址读取数据
mov eax, word_123456
据推测,这将从内存中获取数据。现在让我说我存储它
mov word_123456, eax
我从CPU架构图中了解到随机存取存储器和CPU之间存在缓存。如果我要求将寄存器的内容存储在内存中,它是否总是首先进入L1缓存?谁决定最终的缓存?另外,我很好奇你是否可以编写/提示你的x86命令来指定移动操作是应该存储在缓存中还是将是一个罕见的读/写等。
答案 0 :(得分:2)
默认情况下,所有内容都将进入L1和L2缓存。 (我稍微简化了WRT原子访问,但是如果你只是做mov
那就是交易。)它并不是真的进入了L1缓存"首先",一旦你将它读入寄存器,缓存行也缓存以供日后使用。
(我在这里也得到了一些特定于体系结构的架构。一些架构选择将两个缓存排除在外,这样就可以从L2缓存中删除L2缓存线,将其放入L1缓存中。但是这样不会对代码性能产生巨大影响,仅仅因为L2缓存比L1缓存大得多。它更像是一个簿记的东西。)
L2缓存的目的是比L1缓存更大,这样如果某些东西在L1缓存中但已被驱逐,希望它仍然在L2缓存中并且不会需要一直到RAM。
是的,您可以提示您的写操作绕过缓存。例如,这是movnti
的目的。但是,不要使用movnti
手动打扰所有只写访问。实际的性能优势很小,即使你当前的功能没有从内存中读回来,一些其他即将执行的代码也是不错的。