clflushopt
是该用例一个可怕的想法。在覆盖之前从缓存中逐出线条与您想要的相反。如果它们在缓存中很热,则可以避免使用RFO(读取所有权)。
如果您使用NT店,他们会驱逐仍然是热的所有行,以便它不值得花费的周期做clflushopt
第一。
如果没有,你完全保证最坏的情况下搬起石头砸自己的脚。请参阅Enhanced REP MOVSB for memcpy了解更多关于写入存储器的信息,以及RFO与no-RFO存储器的关系。 (例如,rep movsb
至少可以在英特尔上无RFO存储,但仍然会将数据留在缓存中)。并且请记住,L3命中可以比进入DRAM更快地满足RFO。
如果你要写定期存储缓冲器(将RFO),你可能会prefetchw
它得到它变成唯一状态在L1D你准备好实际写入之前。
这有可能是clwb
(高速缓存行回写(不驱逐))在这里很有用,但我认为prefetchw
总是会至少这么好,如果没有更好的(特别是在AMD那里MOESI cache coherency可以转移脏所以你可以在你的L1D中得到一条仍然很脏的线路,并且能够在没有将旧数据发送到DRAM的情况下替换那些数据。)
理想情况下,malloc
会给你记忆仍然很热当前内核的L1D缓存。如果你发现很多时候,你得到的仍然是肮脏的缓冲区,而在另一个核心上的L1D或L2上,然后查看带有每线程池的malloc或某种类似NUMA的线程感知。
我的理解,_mm_clflushopt()
后,我需要调用_mm_sfence()
使其非临时卖场看到其他核心/处理器。
不,不认为clflushopt
的商店。它不会使全局可见的新数据,所以它不会与全局的内存操作顺序进行交互。
sfence
使您线程的后店等待刷新的数据是一路刷新到DRAM或存储器映射的非易失性存储。
如果您正在刷新由常规DRAM支持的行,那么在存储之前您只需要sfence
即可启动非相干DMA操作,该操作将在不检查缓存的情况下读取DRAM内容。由于其他CPU内核做总是通过高速缓存,sfence
是不是对您有用或必要的。 (即使clflushopt
是摆在首位是个好主意。)
即使你在谈论实际NT店,其他核心最终会看到你的店没有sfence
。如果你需要确保他们看到你的NT商店才看到一些后来店只需sfence
。我在Make previous memory stores visible to subsequent memory loads
可以解释这个吗?
不,clflushopt
不影响缓存一致性。它只会触发回写(&逐出),而不会让后来的存储/加载等待它。
你可以clflushopt
内存分配,并在不影响正确性被另一个线程使用。
请问,什么是摆在首位驱逐缓存的目的是什么? –
@PasserBy,让它尽快被下一步真正使用的数据占据。如果没有明确的驱逐它,CPU会将旧的(不再使用的)数据保留在缓存中,直到旧数据变得最近被使用(LRU)w.r.t.缓存中的其他数据。 –
如果它是可证明的,在高速缓存中的内容不再需要,并驱逐其既有可能,并提供加速,那不是已经被列入优化? –