gpt4 book ai didi

multithreading - 为什么存储负载屏障被认为是昂贵的?

转载 作者:行者123 更新时间:2023-12-04 00:52:17 26 4
gpt4 key购买 nike

大多数 CPU 架构会重新排序存储加载操作,但我的问题是为什么?我对存储加载屏障的解释如下:

x = 50;
store_load_barrier;
y = z;

此外,与释放和获取语义相比,我看不出这个障碍在无锁编程中有多大用处。

最佳答案

简答 :存储加载屏障防止处理器推测性地执行存储加载屏障之后的 LOAD,直到所有先前的存储完成。

详情 :

存储加载屏障昂贵的原因是它阻止了跨屏障的 LOAD 和 STORE 操作的重新排序。

假设您有一个如下所示的指令序列:

...             ;; long latency operation to compute r1
ST r1, [ADDR1] ;; store value in r1 to memory location referenced by ADDR1
LD r3, [ADDR2] ;; load r3 with value in memory location ADDR2
... ;; instructions that use result in r3

当这个序列执行时, r1 的值将是需要很长时间才能完成的操作的结果。指令 ST r1, [ADDR1]将不得不拖延到 r1在此期间,无序处理器可以推测性地执行 LD r3, [ADDR2]和其他说明,如果它们独立于较早的商店。在提交存储之前,它们实际上不会提交,但是通过推测性地完成大部分工作,结果可以保存在重新排序缓冲区中,并准备好更快地提交。

这适用于单处理器系统,因为 CPU 可以检查 ADDR1 和 ADDR2 之间是否存在相关性。但在多处理器系统中,多个 CPU 可以独立执行加载和存储。可能有多个处理器执行 ADDR1 的 ST 和 ADDR2 的 LD。如果 CPU 能够推测性地执行这些似乎没有依赖性的指令,那么不同的 CPU 可能会看到不同的结果。我认为 following blog post很好地解释了这是如何发生的(我认为我不能在这个答案中简洁地总结出来)。

现在考虑具有存储加载屏障的代码序列:
...             ;; long latency operation to compute r1
ST r1, [ADDR1] ;; store value in r1 to memory location referenced by ADDR1
ST_LD_BARRIER ;; store-load barrier
LD r3, [ADDR2] ;; load r3 with value in memory location ADDR2
... ;; instructions that use result in r3

这将阻止 LD r3, [ADDR2]指令和后续相关指令从推测执行直到前一个存储指令完成。这可能会降低 CPU 性能,因为整个 CPU 流水线可能不得不在等待 ST 指令完成时停顿,即使在 CPU 本身中,LD 和 ST 之间没有依赖性。

可以采取一些措施来限制 CPU 必须停止的数量。但最重要的是,存储-加载屏障在加载和存储之间创建了额外的依赖关系,这限制了 CPU 可以执行的推测执行量。

关于multithreading - 为什么存储负载屏障被认为是昂贵的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27475025/

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