gpt4 book ai didi

multithreading - 内存屏障强制缓存一致性?

转载 作者:行者123 更新时间:2023-12-04 05:37:52 27 4
gpt4 key购买 nike

我正在阅读 this question about using a bool for thread control并被@eran 的回答所吸引:

Using volatile is enough only on single cores, where all threads use the same cache. On multi-cores, if stop() is called on one core and run() is executing on another, it might take some time for the CPU caches to synchronize, which means two cores might see two different views of isRunning_.

If you use synchronization mechanisms, they will ensure all caches get the same values, in the price of stalling the program for a while. Whether performance or correctness is more important to you depends on your actual needs.


我花了一个多小时搜索一些声明同步原语强制缓存一致性但失败了。我最接近的是 Wikipedia :

The keyword volatile does not guarantee a memory barrier to enforce cache-consistency.


这表明内存屏障确实强制缓存一致性,并且由于一些同步原语是使用内存屏障实现的(再次来自维基百科),这是一些“证据”。
但我不知道是否相信这一点,并确保我没有误解它。
有人可以澄清一下吗?

最佳答案

据我了解,同步原语根本不会影响缓存一致性。缓存是法语的隐藏,它不应该对用户可见。缓存一致性协议(protocol)应该在没有程序员参与的情况下工作。

同步原语将影响内存排序,这是明确定义的,并且通过处理器的 ISA 对用户可见。

A Primer on Memory Consistency and Cache Coherence 是一个提供详细信息的好来源来自计算机体系结构综合讲座系列。

编辑 : 澄清你的疑惑

维基百科的说法有些错误。我认为混淆可能来自内存一致性和缓存一致性这两个术语。他们不是同一个意思。
volatile C 中的关键字意味着变量总是从内存中读取(而不是寄存器),并且编译器不会重新排序围绕它的加载/存储。这并不意味着硬件不会重新排序加载/存储。这是一个内存一致性问题。当使用较弱的一致性模型时,程序员需要使用同步原语来强制执行特定的排序。这与缓存一致性不同。例如,如果线程 1 修改了位置 A,那么在此事件线程 2 加载位置 A 之后,它将收到一个更新的(一致的)值。如果使用缓存一致性,这应该会自动发生。内存排序是一个不同的问题。您可以查看著名论文Shared Memory Consistency Models: A Tutorial了解更多信息。 Dekker's Algorithm 是比较知名的例子之一。这需要顺序一致性或同步原语。

编辑2 : 我想澄清一件事。虽然我的缓存一致性示例是正确的,但存在内存一致性似乎与其重叠的情况。当存储在处理器中执行但延迟进入缓存时(它们在存储队列/缓冲区中)。由于处理器的缓存没有收到更新的值,其他缓存也不会。这看起来像是一个缓存一致性问题,但实际上它不是而且实际上是 ISA 内存一致性模型的一部分。在这种情况下,可以使用同步原语将存储队列刷新到缓存中。考虑到这一点,您以粗体突出显示的 Wikipedia 文本是正确的,但另一个仍然有点错误:关键字 volatile 不保证内存屏障来强制缓存一致性 .应该说:关键字 volatile 不能保证使用内存屏障来强制执行内存一致性 .

关于multithreading - 内存屏障强制缓存一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com