在本文中: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();
https://stackoverflow.com/questions/18550784
复制