英特尔的 CLWB 指令使缓存行无效

Intel's CLWB instruction invalidating cache lines

我正在尝试为 Intel 的 clwb 指令寻找不会使高速缓存行无效的配置或内存访问模式。我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试。 Linux 版本为 5.4.0-3-amd64。我尝试使用 Device-DAX 模式并将此字符设备直接映射到地址 space。我还尝试将此非易失性内存添加为新的 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];    
}

两次读取都导致缓存未命中。

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

clwb 在 SKX 和 CSL 上的行为类似于 clflushopt。但是,在这些处理器上使用 clwb 的程序将在 运行 支持 clwb.

优化实现的未来进程上自动受益。

clwb 保留 ICL 上的缓存行。

请注意 cpuid 来自 InstLatx64 的叶 0x7 信息说 ICL 不支持 clwb,这是不正确的。

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