Intel's CLWB instruction invalidating cache lines

8

我正在尝试找到适用于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];    
}

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

我想知道是否有其他人尝试检测是否有一些配置或内存访问模式可以使缓存行保留在缓存中?


1
我认为这对你来说已经很清楚了,但是英特尔对CLWB的定义并不要求在任何特定平台上存在这样的情况。如果我想找到这样的情况,我会在普通的非持久性内存上测试CLWB,并尝试从本地和远程插座访问正常和持久性内存。 - John D McCalpin
6
当前的处理器可能没有保留使用CLWB的行,但是未来的处理器可能会有不同的行为。除了排序细节可能有所不同外,目前的实现中可能使用CLFLUSH来实现CLWB。CLWB与我的专利(https://patents.google.com/patent/US20090216950)有一些相似之处,但我认为它存在的唯一目的就是确保脏数据已写入持久性内存。 - John D McCalpin
2
@PeterCordes 是的,如果没有使用clwb指令,我会在第一次读取操作时出现缓存未命中,然后在第二次读取时出现缓存命中。例如,我正在评估数组大小为100,000,并且使用和不使用clwb指令之间存在明显差异。 - Ana Khorguani
1
@JohnDMcCalpin 我明白了。基本上,例如 Skylake 微架构中的 clwb 与 clflushopt 具有完全相同的行为。正如您所说,这三个指令都确保脏数据已写入持久性内存,但与 clflush 不同,clwb 和 clflushopt 几乎没有排序约束,除了栅栏。但是,有两个执行相同操作的指令,而且它们都不会使缓存行失效,这有点令人失望。因此,我在想,也许我错过了一些配置细节或访问模式,可以利用 clwb 来不使缓存行失效。 - Ana Khorguani
2
同意,这确实让人失望。但比起等待支持该指令的CPU(无清除操作)的推出,英特尔在首批支持持久内存的CPU中引入 clwb 以便未来的库可以无需基于CPUID进行动态调度就能使用它,这仍然是好得多的。一旦有支持它的CPU,长期来看它会变得更加美好。感谢您发布关于SKX行为的信息;像您一样,我一直认为CLWB会执行其设计用途。希望它会尽快实现,如冰湖处理器。 (如果这对非笔记本电脑甚至算作不久的话...) - Peter Cordes
显示剩余3条评论
1个回答

4

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

clwb在ICL上保留高速缓存线。

注意,InstLatx64的cpuid叶0x7信息表明ICL不支持clwb,这是不正确的。

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


我已经与SKX和CSL核实过,clwb的行为类似于clflushopt,但这是官方信息还是基于实验的结果呢? - Ana Khorguani
@AnaKhorguani 实验。但它也与文档所说的兼容,即它可能在缓存层次结构的一个或多个级别中保留缓存行。 - Hadi Brais
好的,谢谢。嗯,这可能正是我的问题:D 只要说从某些微架构中它不会失效,那就更清楚了。 - Ana Khorguani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接