我注意到英特尔Tremont有 64 字节的存储指令,带有MOVDIRI和MOVDIR64B。
这些保证原子写入内存,而不保证加载原子性。此外,写入是弱排序的,可能需要紧跟其后的防护。
我MOVDIRx在 IceLake 中找不到。
为什么冰湖不需要这样的指令MOVDIRx?
(在第 15 页底部)
英特尔® 架构指令集扩展和未来功能编程参考
https://software.intel.com/sites/default/files/managed/c5/15/architecture-instruction-set-extensions-programming-reference .pdf#page=15
通常,缓存行是 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重新启动后?
由同一线程发出的对同一缓存行的非临时存储(例如 movnti)是否按程序顺序到达内存?
那么,对于具有 NVRAM 的系统(例如具有 Intel 3D XPoint NVRAM 的 Intel Cascade Lake 处理器),在崩溃的情况下,缺乏重新排序可以保证写入同一缓存行的前缀优先吗?