我正在尝试为英特尔的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];
}
Run Code Online (Sandbox Code Playgroud)
两次读取都会导致缓存未命中。
我想知道是否还有其他人试图检测是否有某种配置或内存访问模式会在缓存中留下缓存行?
通常,缓存行是 64B,但非易失性内存的原子性是 8B。
例如:
x[1]=100;
x[2]=100;
clflush(x);
Run Code Online (Sandbox Code Playgroud)
x缓存行对齐,并且最初设置为0。
系统崩溃 clflush();
是否有可能x[1]=0,x[2]=100重新启动后?
当使用像 Intel optane DCPMM 这样的持久内存时,如果在执行 movnt 指令时系统崩溃(断电),是否可以在重新启动后看到部分结果?
为了:
movntix86 保证原子用于其他目的?movntdq/movntps不保证原子性,但实际上可能在支持持久内存的 CPU 上。vmovntdq/vmovntpsvmovntdq/vmovntps全线商店MOVDIR64B在支持它和 DC-PM 的未来 CPU 上保证了 64 字节写入原子性。例如Sapphire Rapids Xeon / Tiger Lake / Tremont。movntpd假定与 相同movntps。
相关问题:
由同一线程发出的对同一缓存行的非临时存储(例如 movnti)是否按程序顺序到达内存?
那么,对于具有 NVRAM 的系统(例如具有 Intel 3D XPoint NVRAM 的 Intel Cascade Lake 处理器),在崩溃的情况下,缺乏重新排序可以保证写入同一缓存行的前缀优先吗?