openmp 条件并行循环

Posted

技术标签:

【中文标题】openmp 条件并行循环【英文标题】:openmp conditional parallel loop 【发布时间】:2017-01-03 19:14:45 【问题描述】:

如果某个条件成立,我正在尝试使用 openmp for 循环。如果条件成立,我可以简单地使用 if else 语句来使用并行 for 循环,但是 for 循环中的代码有点长,如果我只使用 if else 语句,它将使代码的长度加倍。所以基本上,我想要一个更好的方法来做到这一点:

if(condition_holds)
   // use parallel for loop
   #pragma omp parallel for
   for(...)
     // Long piece of code
   
else
  // Don't use parallel for loop
  for(...)
    // Long piece of code
  

这样我就不必在 for 循环中编写两次代码了。

【问题讨论】:

你可以用函数或函数对象来包装你的“长代码”,例如拉姆达。两个for 循环都只包含一个调用。 【参考方案1】:

使用 OpenMP 的 if 子句有条件地启用并行性:

#pragma omp parallel for if(condition_holds)
for(...) 


由于循环体被 OpenMP 实现分离为一个函数,因此您可能会获得一个额外的函数调用的开销。

【讨论】:

并行模式库 (PPL) 是否有类似的功能? @user2399267 ......似乎很好 看起来没有。但是您必须使用 lambda 或某种可调用的方法调用并行算法,因此您可以将其捕获到变量中并从 else 子句循环调用它。这应该很容易模板化为parallel_for_if 算法...

以上是关于openmp 条件并行循环的主要内容,如果未能解决你的问题,请参考以下文章

openMP 嵌套并行 for 循环与内部并行 for

非for循环的OpenMP并行化

如何使用 MPI 和 OpenMP 运行并行循环

OpenMp根据变量设置并行循环的线程数

如何使用 OpenMP 通过 C++ std::list 并行化 for 循环?

OpenMP 嵌套循环任务并行性,计数器未给出正确结果