gpt4 book ai didi

multithreading - 为什么内存重新排序在单核/处理器机器上不是问题?

转载 作者:行者123 更新时间:2023-12-03 12:44:27 24 4
gpt4 key购买 nike

考虑以下取自维基百科的示例,稍作修改,其中程序的步骤对应于各个处理器指令:

x = 0;
f = 0;

Thread #1:
while (f == 0);
print x;

Thread #2:
x = 42;
f = 1;

我知道 print由于乱序执行,当线程在两个不同的物理内核/处理器上运行时,语句可能会打印不同的值(42 或 0)。

但是我不明白为什么这在单核机器上不是问题,这两个线程运行在同一个核心上(通过抢占)。根据 Wikipedia :

When a program runs on a single-CPU machine, the hardware performs the necessary bookkeeping to ensure that the program executes as if all memory operations were performed in the order specified by the programmer (program order), so memory barriers are not necessary.



据我所知,单核 CPU 也会对内存访问重新排序(如果它们的内存模型很弱),那么是什么确保程序顺序被保留呢?

最佳答案

CPU 不会意识到这是两个线程。线程是一种软件结构 (1)。

所以 CPU 看到这些指令,按以下顺序:

store x = 42
store f = 1
test f == 0
jump if true ; not taken
load x

如果 CPU 将 x 的存储重新排序到最后,在加载后,它会改变结果。虽然允许 CPU 乱序执行,但它仅在不改变结果时才这样做。如果允许这样做,几乎所有指令序列都可能失败。不可能产生一个工作程序。

在这种情况下,不允许单个 CPU 重新排序存储超过相同地址的负载。至少,就 CPU 而言,它没有重新排序。就 L1、L2、L3 缓存和主内存(以及其他 CPU!)而言,可能存储尚未提交。

(1) 像超线程这样的东西,每个内核两个线程,在现代 CPU 中很常见,不会算作“单 CPU”w.r.t.你的问题。

关于multithreading - 为什么内存重新排序在单核/处理器机器上不是问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59217821/

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