我正在尝试为Intel的clwb指令查找配置或内存访问模式,该配置或内存访问模式不会使高速缓存行无效。我正在使用NVDIMM的Intel Xeon Gold 5218处理器进行测试。 Linux版本是5.4.0-3-amd64。我尝试使用Device-DAX模式并将此char设备直接映射到地址空间。我还尝试将此非易失性内存添加为新的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
的行为类似于SKX和CSL上的clflushopt
。但是,在将来的支持clwb
优化实现的进程上运行时,在这些处理器上使用clwb
的程序将自动受益。
《英特尔优化手册》(2019年9月)的第2.1.1.4节提到clwb
在Ice Lake Client上是新的。也许这意味着clwb
的性能优势在Ice Lake上是新的。尽管来自cpuid
的InstLatx64叶子0x7信息表明ICL不支持clwb
。我不确定这是谁的错。应当检查_mm_clwb(void const *p)
是否适用于ICL。无论如何,ICX很可能会支持它。
clwb
在Zen 2上也受支持,但我不知道它如何在此微体系结构上工作。