非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并行化的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenMP 中并行化嵌套循环并使用更多线程执行内部循环
使用 OpenMP 在 C、C++ 中并行化嵌套 for 循环的几种方法之间的区别