结合std::execution和OpenMP是否可取

Is combining std::execution and OpenMP advisable?

本文关键字:是否 OpenMP std execution 结合      更新时间:2023-10-16

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

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

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

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

只有最新的版本,OpenMP 5.0,甚至定义了与C++11的交互。通常,使用C++11中的任何内容并转发"都可能导致未指定的行为">。虽然OpenMP规范的未来版本预计将解决以下功能,但目前使用这些功能可能会导致未指定的行为。

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

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