我正在尝试找到适用于Intel的clwb指令的配置或内存访问模式,以避免缓存行失效。我正在使用搭载NVDIMMs的Intel Xeon Gold 5218处理器进行测试。Linux版本为5.4.0-3-amd64。我尝试使用Device-DAX模式,并将此字符设备直接映射到地址空间。我还尝试将此非易失性内存添加为新的NUMA节点,并使用numactl --membind
命令将内存绑定到该节点。在这两种情况下,当我使用clwb指令处理缓存地址时,缓存会被清除。关闭预取器后,我使用PAPI硬件计数器观察缓存失效。
这是我正在测试的一个简单循环。数组和tmp变量都声明为volatile,因此加载实际上已执行。
for(int i=0; i < arr_size; i++){
tmp = array[i];
_mm_clwb(& array[i]);
_mm_mfence();
tmp = array[i];
}
两个读取都导致缓存未命中。
我想知道是否有其他人尝试检测是否有一些配置或内存访问模式可以使缓存行保留在缓存中?
clwb
以便未来的库可以无需基于CPUID进行动态调度就能使用它,这仍然是好得多的。一旦有支持它的CPU,长期来看它会变得更加美好。感谢您发布关于SKX行为的信息;像您一样,我一直认为CLWB会执行其设计用途。希望它会尽快实现,如冰湖处理器。 (如果这对非笔记本电脑甚至算作不久的话...) - Peter Cordes