首页 > 解决方案 > 建议将 std::execution 和 OpenMP 结合起来吗?

问题描述

我使用 OpenMP 已经有一段时间了。最近,在一个新项目上,我选择使用c++17,用于一些功能。

因此,我一直担心允许并行化算法的 std::execution 。这看起来非常强大和优雅,但是它们是 OpenMP 的许多功能非常有用,但不容易与算法一起使用(屏障、SIMD、关键等)。

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

标签: c++openmpc++17

解决方案


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

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

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

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


推荐阅读