c++ - 建议将 std::execution 和 OpenMP 结合起来吗?

标签 c++ openmp c++17

我使用 OpenMP 一段时间了。最近,在一个新项目中,我选择使用c++17来实现某些功能。

因此,我一直担心允许并行化算法的 std::execution。这看起来真的很强大而且很优雅,但是 OpenMP 的很多功能确实很有用,但不容易与算法一起使用(barrier、SIMD、Critical 等)。

所以我想将 std::execution::par (或 unseq_par)与 OpenMP 混合。这是一个好主意,还是我应该只使用 OpenMP?

最佳答案

不幸的是,这未得到官方支持。它可能工作也可能不起作用,具体取决于实现,但它不可移植。

只有最新版本 OpenMP 5.0 甚至定义了与 C++11 的交互。一般来说,使用 C++11 及之后的任何内容“可能会导致未指定的行为”。虽然 OpenMP 规范的 future 版本预计将解决以下功能,但目前它们的使用可能会导致未指定的行为。

  • 对齐支持
  • 标准布局类型
  • 允许移动构造抛出
  • 定义移动特殊成员函数
  • 并发
  • 数据依赖性排序:原子和内存模型
  • 标准库的新增内容
  • 线程本地存储
  • 并发动态初始化和销毁​​
  • C++11 库

虽然没有提及 C++17 及其特定的高级并行性支持,但从该列表中可以清楚地看出,它不受支持。

关于c++ - 建议将 std::execution 和 OpenMP 结合起来吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58710115/

相关文章:

C++ - 如何获取正在运行的进程的 .exe 路径作为 std::string?

c++ - 为什么这个派生类的定义是非法的?

r - 使用 gcc OpenMP 支持从源代码构建 R 时出错

c - 嵌套循环和 openmp 的问题

c++ - 在 openmp 中使用不同线程组装 vector 时缩放比例不佳

c++ - 我们应该在 C++17 及更高版本中使用临时对象的生命周期延长吗?

c++ - 内联静态成员变量

c++ - 为什么不能在函数之间直接传递右值引用参数?

c++ - constexpr if 和 static_assert

c++ - 创建二维数组异常 : clean-up before re-throw in C++