我应该在 openMP 并行区域内使用 gnu 并行模式函数吗(for-loop,tasks)

Posted

技术标签:

【中文标题】我应该在 openMP 并行区域内使用 gnu 并行模式函数吗(for-loop,tasks)【英文标题】:Should I use gnu parallel mode function inside openMP parallel region(for-loop, tasks) 【发布时间】:2015-08-13 17:39:03 【问题描述】:

我有一个由openMP加速的程序,在并行区域内,调用了std::nth_elementstd::sortstd::partition等函数。实际上,这些函数用于处理每个openmp-thread对应的数组部分。

最近,我发现g++已经实现了上述函数的并行版本,所以我想知道我应该在#pragma omp task#pragma omp for区域内使用__gnu_parallel::nth_element这样的函数吗?如果我使用并行模式,线程总数是否会超过omp_set_num_threads() 设置的限制并导致更差的加速?

【问题讨论】:

【参考方案1】:

简单(也是最佳)答案:基准测试并发布您的发现。

不太确定:根据我的经验,大多数算法的并行版本的效率低于可比较的串行算法,而是依靠多个并行处理器来补偿挂壁时间。关于线程数,我不认为 OMP 会在限制时产生新线程。我确实记得嵌入的#pragma omp for 区域实际上并不会导致每个外线程产生更多没有特定标志的“内线程”(我不记得了)。

【讨论】:

以上是关于我应该在 openMP 并行区域内使用 gnu 并行模式函数吗(for-loop,tasks)的主要内容,如果未能解决你的问题,请参考以下文章

用于区域线程关联的 OpenMP 并行

openMP C++ 简单并行区域 - 输出不一致

openmp/C++ 简单并行区域返回不一致的结果

Xeon-Phi 从主机 openMP 并行区域异步卸载

c ++ OpenMP关键:“单向”锁定?

如何使用带有串行内循环的openMP并行化外循环以进行数组添加