関数呼び出しを含むループの並列化に適していますか、それとも基本的な操作を内部で実行しているループの並列化の方がはるかに便利ですか。
たとえば、次のように並列化ディレクティブを配置するのは適切ですか?
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 に感謝します。そのコメントは役に立ちました。rcrd が提案した本を詳しく調べてみます。しかし、一日の終わりまでに、可能であれば、既存の 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)
}
}