gpt4 book ai didi

c++ - 混合 C++11 原子和 OpenMP

转载 作者:IT老高 更新时间:2023-10-28 22:04:42 26 4
gpt4 key购买 nike

OpenMP 有自己对原子访问的支持,但是,至少有两个原因更喜欢 C++11 原子:它们更灵活,并且它们是标准的一部分。另一方面,OpenMP 比 C++11 线程库更强大。

该标准在两个不同的章节中指定了原子操作库线程支持库。这让我相信原子访问的组件与使用的线程库有点正交。我真的可以将 C++11 atomics 和 OpenMP 结合起来吗?


有一个很similar question在堆栈溢出;但是,由于它的答案没有回答实际问题,因此三年来基本上没有答案。

最佳答案

更新:

OpenMP 5.0 定义了与 C++11 及进一步的交互。其中,它表示使用以下功能可能会导致未指定的行为:

  • 数据依赖排序:原子和内存模型
  • 对标准库的补充
  • C++11 库

很明显,混合 C++11 原子和 OpenMP 5.0 将导致未指定的行为。至少标准本身 promise “OpenMP 规范的 future 版本有望解决 [这些] 特性”。

旧讨论:

有趣的是,OpenMP 4.5 标准 (2.13.6) 对 C++11 原子的引用相当模糊,或更具体的 std::memory_order:

The intent is that, when the analogous operation exists in C++11 or C11, a sequentially consistent atomic construct has the same semantics as a memory_order_seq_cst atomic operation in C++11/C11. Similarly, a non-sequentially consistent atomic construct has the same semantics as a memory_order_relaxed atomic operation in C++11/C11.

不幸的是,这只是一个音符,没有任何东西可以定义他们在一起演奏得很好。特别是,即使是最新的 OpenMP 5.0 预览版仍然将 C++98 称为 C++ 的唯一规范引用。所以从技术上讲,OpenMP 甚至不支持 C++11 本身。

除此之外,它可能在实践中的大部分时间都有效。我同意使用 std::atomic 如果与 OpenMP 一起使用,那么与 C++11 线程相比,出现问题的可能性更小。但如果有什么麻烦,可能就不是那么明显了。最坏的情况是不能以原子方式运行的原子,即使我很难想象可能发生这种情况的现实场景。归根结底,这可能不值得,最安全的做法是坚持使用纯 OpenMP 或纯 C++11 线程/原子。

也许 Hristo 对此有话要说,同时查看 this answer进行更一般的讨论。虽然有点过时,但恐怕它仍然存在。

关于c++ - 混合 C++11 原子和 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309299/

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