gpt4 book ai didi

c++ - 内存屏障到底要解决什么问题?

转载 作者:行者123 更新时间:2023-12-05 01:04:43 29 4
gpt4 key购买 nike

我现在正试图解决内存障碍的问题。我一直在阅读和观看有关该主题的视频,我想确保自己理解正确,并提出一两个问题。

我从准确理解问题开始。让我们以下面的经典示例作为讨论的基础:假设我们有 2 个线程在 2 个不同的内核上运行

这是伪代码!

我们从 int f = 0; int x = 0; 然后运行那些线程:

# Thread 1

while(f == 0);

print(x)
# Thread 2 

x = 42;
f = 1;

当然,这个程序想要的结果是线程 1 将打印 42。

注意:我不讨论“编译时重新排序”,我只想关注运行时发生的事情,因此忽略编译器可能进行的各种优化。

好吧,据我了解,这里的问题是所谓的“内存重新排序”:只要最终结果符合程序的预期,CPU 就可以自由地重新排序内存操作。在这种情况下,在线程 2 中,f = 1 可能会在 x = 42 之前执行。在这种情况下,线程 1 将打印 0,这不是程序员想要的。

此时,维基百科指出了另一种可能发生的情况:

Similarly, thread #1's load operations may be executed out-of-order and it is possible for x to be read before f is checked

既然我们现在谈论的是“乱序执行”——让我们暂时忽略内核缓存。那么让我们来分析一下这里发生了什么。从线程 2 开始 - 编译后的指令看起来(在伪汇编中)类似于:

1 put 42 into register1
2 write register1 to memory location of x
3 put 1 into register 2
4 write register2 to memory location of f

好的,我知道 3-4 可能会在 1-2 之前执行。但我不明白线程1中的等价物:

假设线程 1 的指令类似于:

1 load f to register1
2 if f is 0 - jump to 1
3 load x to register2
4 print register2

这里究竟有什么问题? 3可以在1-2之前吗?

让我们继续吧:到目前为止,我们都在讨论乱序执行,这让我想到了我的主要困惑:

this great post作者这样描述问题:每个核心都有自己的缓存,核心对缓存进行内存操作,而不是对主存进行内存操作。内存从特定于内核的缓存到主内存(或共享缓存)的移动发生在不可预测的时间和顺序中。所以在我们的例子中——即使线程 2 将按顺序执行它的指令——x=42 的写入也会发生在 f=1 之前,但这只是为了core2的缓存。将这些值移动到共享内存的顺序可能相反,因此会出现问题。

所以我不明白 - 当我们谈论“内存重新排序”时 - 我们是在谈论乱序执行,还是在谈论跨缓存的数据移动?

最佳答案

when we talk about "memory reordering" - do we talk about Out-of-order execution, or are we talking about the movement of data across caches?

当线程以特定顺序观察值的变化时,从程序员的角度来看,无法区分这是否是由于加载的无序执行、存储缓冲区相对于加载延迟存储并可能让它们提交乱序(无论执行顺序如何),或(假设在没有一致缓存的 CPU 中)缓存同步。

或者甚至通过在逻辑核心之间转发存储数据而不经过缓存,在它提交到缓存并且对所有核心可见之前。 Some POWER CPUs can do this in real life但很少有其他人。

Real CPUs have coherent caches ;一旦一个值提交到缓存,它对所有内核都是可见的;在其他拷贝已经失效之前它不会发生,因此这不是读取“陈旧”数据的机制。实际 CPU 上的内存重新排序为 something that happens within a core ,连贯缓存的读取和写入可能以与程序顺序不同的顺序发生。缓存不同步后不会重新同步;它首先保持一致性。

无论机制如何,重要的影响是另一个线程观察您正在读取/写入的相同变量,可以看到效果以与汇编程序顺序不同的顺序发生。

关于c++ - 内存屏障到底要解决什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71644651/

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