在本文中:http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484?pgno=2说,我们不能对volatile进行任何优化,即使是(其中:volatile int& v = *(address);):
v = 1; // C: write to v
local = v; // D: read from v无法对此进行优化:
v = 1; // C: write to v
local = 1; // D: read from v // but it can be done for std::atomic<>这是不可能的,因为在第1行和第2行之间,v值可以由硬件设备(而不是不能工作缓存一致性的CPU :网络适配器、GPU、FPGA等)(序列/并发)来改变,后者映射到这个内存位置。但是,只有当v不能在CPU缓存L1/2/3中缓存时才有意义,因为对于通常(非volatile)在第1行和第2行之间的变量来说,时间太短,很可能触发缓存。
volatile限定符是否保证不缓存此内存位置?
答案:
volatile 并不保证这个内存位置没有缓存,而且在C/C++标准或编译手册中也没有关于这一点的任何内容。volatile的可执行代码尝试执行相同的两行,它还会取消设备的高速缓存内存(例如,在缓存GPU-L2中)。和不需要进行GPU缓存刷新,也不需要进行CPU缓存刷新。。另外,对于CPU,可能需要使用std::atomic_thread_fence(std::memory_order_seq_cst); 如果l3-缓存(LLC)与DMA在PCIE上的一致性,但L1/L2不是。。对于nVidia数据自动化系统,我们可以使用:void __threadfence_system();发布于 2013-08-31 17:21:39
volatile确保变量不会在CPU寄存器中被“缓存”。CPU缓存对程序员是透明的,如果另一个CPU写入由另一个CPU的缓存映射的内存,则第二个CPU的缓存将失效,因此在下一次访问期间它将再次从内存中重新加载该值。
关于缓存一致性的一些事情
至于外部内存写入(通过DMA或另一个与CPU无关的通道),您可能需要手动刷新缓存(请参阅这所以的问题)。
C标准第6.7.3节7:
构成对具有易失性限定类型的对象的访问的是实现定义的。
https://stackoverflow.com/questions/18550784
复制相似问题