它是否适合并行化包含函数调用的循环,还是更方便地并行化在内部进行基本操作的循环。
例如,是否适合将并行化指令放置如下?
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)
}
}