并行化包含函数调用的循环

时间:2010-01-25 09:54:49

标签: c++ c openmp parallel-processing

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

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

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)
 }
}

2 个答案:

答案 0 :(得分:1)

需要了解三位信息:

  1. 执行foo的顺序是否重要?
  2. foo()是否影响共享状态,如果有,是否有适当的锁定?
  3. 在没有openmp的情况下循环运行多长时间?
  4. 如果您的任务需要很长时间 - 几秒钟或更长时间 - 并且可以将其分解为独立的部分(有时通过重构,例如通过分成作业并在合并之前收集每个作业的结果)然后它可以是值得尝试并行化。

    资料!

答案 1 :(得分:0)

这样的问题的答案可以在麻省理工学院出版社,使用OpenMP中找到,这是由一些开发OpenMP规范的人编写的。

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