5

它是否适合并行化包含函数调用的循环,还是更方便地并行化在内部进行基本操作的循环。

例如,是否适合将并行化指令放置如下?

main(){
..
#omp paralel ..
for (i=0;i<100;i++){
a[i] = foo(&datatype , ...);
...
}
..
}

int foo(datatype *a,...){
//doing complex operations here
//calling other functions etc.
}

谢谢 Will Richard 和 Phkahler,这些评论很有帮助,我将深入研究 rchrd 建议的书。但是在一天结束之前,如果可能的话,我希望我将现有的 C 代码(实际上是一个位于程序顶部的大循环)与 openMP 并行化。

在这一点上,我需要一些帮助来使循环的至少某些部分并行化。为了简单起见,我如何才能使其中的一部分并行工作,而不是对整个循环内容进行并行处理

for(i to N){   
  work1() --(serial)
  work2() --(serial)
  Work3() --( PARALLEL)
  work4() --(serial)
}

//does it make sense adding critical sections except work3

#omp parallel for private(Ptr)
for(i to N){   
 #omp single
 {
  work1() --(serial)
  work2() --(serial)
 }
  Work3(Ptr) --( PARALLEL)
 #omp single
 {
  work4() --(serial)
 }
}
4

2 回答 2

1

需要知道三个信息:

  1. 执行 foo 的顺序是否重要?
  2. foo() 是否影响共享状态,如果是,是否有适当的锁定?
  3. 没有openmp,循环运行需要多长时间?

如果您的任务需要很长时间 - 几秒钟或更长时间 - 并且它可以分解为独立的部分(有时通过重构,例如通过划分为作业并在合并之前收集每个作业的结果),那么值得尝试并行化它。

轮廓!

于 2010-01-25T09:59:28.347 回答
0

此类问题的答案可以在 MIT Press Book, Using OpenMP 中找到,它是由一些开发 OpenMP 规范的人编写的。

您可以在 openmp.org 网站上找到更多信息,包括 OpenMP 专家论坛。 http://openmp.org/

于 2010-01-25T19:21:21.383 回答