gpt4 book ai didi

C++0X memory_order 无围栏,应用,支持的芯片

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:58 26 4
gpt4 key购买 nike

作为我之前 question 的跟进, atomic<T>类使用 memory_order 指定大多数操作范围。与栅栏相反,此内存顺序仅影响其操作的原子。据推测,通过使用几个这样的原子,您可以构建一个并发算法,其中其他内存的顺序并不重要。

所以我有两个问题:

  1. 有人能给我指出一个算法/情况的示例,该算法/情况可以从单个原子变量的排序中受益并且不需要需要栅栏吗?
  2. 哪些现代处理器支持这种行为?也就是说,编译器不会只是将特定顺序转换为正常的围栏。

最佳答案

关于 std::atomic<T> 操作的内存排序参数变量不会影响该操作本身的顺序,它会影响该操作与其他操作创建的顺序关系。

例如a.store(std::memory_order_release)它本身并没有告诉你关于 a 的操作方式。相对于其他任何东西都被订购,但与对 a.load(std::memory_order_acquire) 的调用配对从另一个线程,这然后命令其他操作---所有写入其他变量(包括非原子变量)由存储到a的线程完成对执行加载的线程可见,如果该加载读取存储的值。

在现代处理器上,一些内存操作顺序是空操作。例如在 x86 上,memory_order_acquire , memory_order_consumememory_order_release隐含在加载和存储指令中,不需要单独的栅栏。在这些情况下,排序只会影响编译器可以执行的指令重新排序。

澄清:指令中的隐式栅栏可能意味着如果所有内存排序约束都附加到原子变量上的单个操作,则编译器不需要发出任何显式栅栏指令。如果你使用 memory_order_relaxed对于所有内容,并添加显式栅栏,那么编译器可能必须将这些栅栏作为指令显式发出。

例如在 x86 上,XCHG指令带有隐式 memory_order_seq_cst栅栏。因此,在 x86 上为下面两个交换操作生成的代码没有区别——它们都映射到单个 XCHG。说明:

std::atomic<int> ai;
ai.exchange(3,std::memory_order_relaxed);
ai.exchange(3,std::memory_order_seq_cst);

但是,我还不知道有哪个编译器可以去除以下代码中的显式围栏指令:

std::atomic_thread_fence(std::memory_order_seq_cst);
ai.exchange(3,std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_seq_cst);

我希望编译器最终会处理该优化,但在其他类似情况下,隐式栅栏将允许更好的优化。

此外,std::memory_order_consume可以应用于对变量的直接操作。

关于C++0X memory_order 无围栏,应用,支持的芯片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5561889/

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