非for循环的OpenMP并行化

Posted

技术标签:

【中文标题】非for循环的OpenMP并行化【英文标题】:OpenMP parallelization of non-for loop 【发布时间】:2015-10-14 15:52:16 【问题描述】:

到目前为止,我只使用 OpenMP 来并行化 C++ 中的 for 循环。但是我想知道我是否可以并行执行不是 for 循环的其他代码行。

void minimization(int *a, int *x) 
 // this part of the code is dependent of other library.


void checkForNaN(int *a)
 // check nan points


int main() 
  // read data
  minimization (a,b);
  checkForNaN(x);

考虑上面的示例 sn-p,其中 minimization(,)checkForNaN() 是独立的,即任何一个的结果都不会影响另一个。可以并行化吗?

我在想这样的事情:

  int main() 
      // read data
#pragma omp parallel
    
      minimization (a,b);
      checkForNaN(x);
     

看起来正确吗?

【问题讨论】:

【参考方案1】:

这就是 OMP 部分的用途:)

int main() 
    #pragma omp parallel sections
    
        #pragma omp section
         
            minimization(a,b);
        

        #pragma omp section
         
            checkForNaN(x);
        
    

【讨论】:

您也可以使用 OpenMP 任务来实现相同的目标(#pragma omp task)。在***.com/questions/13788638/… 中有一个关于任务和部分之间差异的很好的讨论【参考方案2】:

不,它看起来不正确。它将在您拥有的所有线程中执行minimization(a,b);checkForNaN(x);

相反,这将执行并行化:

int main() 
  // read data
  #pragma omp parallel sections
  
    #pragma omp section
    
      minimization (a,b);
    
    #pragma omp section
    
      checkForNaN(x);
    
  

【讨论】:

我不知道你为什么在今天的帖子上大约 1 分钟后继续发布与我完全相同的答案:p... 这个答案并不完全相同。添加了 @kcc__ 的代码所做的事情。

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

不在 for 循环内的顺序函数的 OpenMP 并行化

OpenMP 无法使用映射迭代器并行化 for 循环

在 OpenMP 中并行化嵌套循环并使用更多线程执行内部循环

使用 OpenMP 在 C、C++ 中并行化嵌套 for 循环的几种方法之间的区别

为啥 OpenMP 不并行化 vtk IntersectWithLine 代码

为什么OpenMP没有并行化vtk IntersectWithLine代码