我使用 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/