发布
社区首页 >问答首页 >易失性限定符是否取消此内存的缓存?

易失性限定符是否取消此内存的缓存?
EN

Stack Overflow用户
提问于 2013-08-31 17:16:59
回答 1查看 4.9K关注 0票数 13

在本文中:http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484?pgno=2说,我们不能对volatile进行任何优化,即使是(其中:volatile int& v = *(address);):

代码语言:javascript
代码运行次数:0
复制
v = 1;                // C: write to v
local = v;            // D: read from v

无法对此进行优化:

代码语言:javascript
代码运行次数:0
复制
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限定符是否保证不缓存此内存位置?

答案:

  1. 不,volatile 并不保证这个内存位置没有缓存,而且在C/C++标准或编译手册中也没有关于这一点的任何内容。
  2. 使用内存映射区域,当内存从设备内存映射到CPU内存时,内存已经标记为WC。 (写组合)代替WB,取消缓存。和不需要做缓存刷新.
  3. 相反,如果CPU内存映射到设备内存,那么顺便提一句,位于CPU晶体上的控制器PCIE正在窥探从该设备中通过DMA的数据,并更新(无效) CPU-cache L3。在这种情况下,如果设备上使用 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();
  4. 当发送未对齐的数据:)时,我们需要刷新DMA-控制器缓存
  5. 此外,我们还可以标记任何内存区域,如WC-通过MTRR寄存器自己标记。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-31 17:21:39

volatile确保变量不会在CPU寄存器中被“缓存”。CPU缓存对程序员是透明的,如果另一个CPU写入由另一个CPU的缓存映射的内存,则第二个CPU的缓存将失效,因此在下一次访问期间它将再次从内存中重新加载该值。

关于缓存一致性的一些事情

至于外部内存写入(通过DMA或另一个与CPU无关的通道),您可能需要手动刷新缓存(请参阅所以的问题)。

C标准第6.7.3节7:

构成对具有易失性限定类型的对象的访问的是实现定义的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18550784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档