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

标签 x86 intel cpu-architecture cpu-cache persistent-memory

我正在尝试为英特尔的 clwb 指令找到不会使缓存行无效的配置或内存访问模式。我正在使用 NVDIMM 对 Intel Xeon Gold 5218 处理器进行测试。 Linux 版本为 5.4.0-3-amd64。我尝试使用 Device-DAX 模式并将这个字符设备直接映射到地址空间。我还尝试将此非 volatile 内存添加为新的 NUMA 节点并使用 numactl --membind命令将内存绑定(bind)到它。在这两种情况下,当我使用 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行为类似于 clflushopt在 SKX 和 CSL 上。但是,使用 clwb 的程序在支持 clwb 优化实现的 future 进程上运行时,这些处理器上将自动受益.clwb保留 ICL 上的高速缓存行。
请注意 cpuid来自 InstLatx64 的叶 0x7 信息说 ICL 不支持 clwb ,这是不正确的。clwb Zen 2 也支持,但我不知道它在这个微架构上是如何工作的。

关于x86 - 英特尔的 CLWB 指令使缓存行无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60266778/

相关文章:

assembly - EAX 寄存器的反转字节顺序

assembly - 使用英特尔 SSE 执行分支的最佳方法是什么?

delphi - Delphi 的 x86 代码生成器框架

performance - x86 uops 究竟是如何调度的?

x86 - 当 Skylake CPU 错误预测分支时究竟会发生什么?

assembly - MESI 协议(protocol)是否足够,还是仍然需要内存屏障? (英特尔 CPU)

c - 从 SSE vector 中提取标量值

Windows 初始执行上下文

cpu-architecture - 如何判断真值表是否有错误?

mips - MIPS 中的加载字节指令