首页 > 解决方案 > 英特尔的 CLWB 指令使缓存行无效

问题描述

我正在尝试为英特尔的clwb指令查找不会使缓存行无效的配置或内存访问模式。我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试。Linux 版本为 5.4.0-3-amd64。我尝试使用 Device-DAX 模式并将这个字符设备直接映射到地址空间。我还尝试将此非易失性内存添加为新的 NUMA 节点并使用numactl --membind命令将内存绑定到它。在这两种情况下,当我使用clwb缓存地址时,它都会被驱逐。我正在使用 PAPI 硬件计数器和禁用的预取器观察驱逐。

这是我正在测试的一个简单循环。array 和 tmp 变量,都被声明为 volatile,所以真正执行了加载。

for(int i=0; i < arr_size; i++){
    tmp = array[i];
    _mm_clwb(& array[i]);
    _mm_mfence();
    tmp = array[i];    
}

两次读取都给出了缓存未命中。

我想知道是否有其他人试图检测是否存在某种配置或内存访问模式会将缓存行留在缓存中?

标签: x86intelcpu-architecturecpu-cachepersistent-memory

解决方案


clwb行为类似于clflushoptSKX 和 CSL。但是,clwb在这些处理器上使用的程序在支持优化实现的未来进程上运行时将自动受益clwb

clwb保留 ICL 上的高速缓存行。

请注意,来自InstLatx64cpuid的叶子 0x7 信息表明 ICL 不支持,这是不正确的。clwb

clwbZen 2 也支持,但我不知道它在这个微架构上是如何工作的。


推荐阅读