结合std::execution和OpenMP是否可取
Is combining std::execution and OpenMP advisable?
我使用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及其特定的高级并行性支持,但从这个列表中可以清楚地看出,它是不受支持的。
相关文章:
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- OpenMP:决定它们是否是素数
- 结合std::execution和OpenMP是否可取
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- OpenMP:当我按线程 ID 访问共享变量时,我是否需要一个关键部分
- 使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
- 使用 openMP simd 进行以下循环是否安全?
- 是否可以使用G 或Clang -OpenMP获得矢量化报告
- openMP 的 SIMD 结构是否需要特定类型的硬件?
- OpenMP 是否将已完成部分的线程重用到另一个线程?
- 是否保证 OpenMP 矢量化
- 如何在OpenMP并行区域内找到是否
- 是否无法对长双数据类型执行openMP矢量化操作
- 如何测试C++是否正在使用openmp
- OpenMP 是否复制私有对象
- 如何判断 OpenMP 是否正常工作
- 是否有可能通过使用openMP在fstream(文件读取)上获得一些性能提升
- 在OpenMP并行区域中使用向量push_back是否安全
- OpenMP原子是否适用于行、变量名或实际内存地址