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 に感謝します。そのコメントは役に立ちました。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)
 }
}
4

2 に答える 2

1

3ビットの情報を知る必要があります。

  1. fooを実行する順序は重要ですか?
  2. foo()は共有状態に影響しますか?影響する場合、適切なロックがありますか?
  3. openmpなしでループを実行するのにどのくらい時間がかかりますか?

長時間(数秒以上)かかるタスクがあり、それを独立した部分に分割できる場合(たとえば、リファクタリングによって、ジョブに分割し、結合する前に各ジョブの結果を収集することによって)、試してみる価値があります。それを並列化します。

プロフィール!

于 2010-01-25T09:59:28.347 に答える
0

このような質問に対する回答は、OpenMP 仕様を開発した一部の人々によって書かれた MIT プレス ブック、Using OpenMP で見つけることができます。

詳細については、openmp.org の Web サイト (OpenMP の専門家によるフォーラムなど) を参照してください。 http://openmp.org/

于 2010-01-25T19:21:21.383 に答える