OpenMPについて

初心者にありがちなミスが,forループしてるところ全部に

#pragma omp parallel for
for(int i=0;i<max;i++){
・・・
}

をつけてしまうこと.

つけまくると各forループでスレッドが生成されて,並列で実行はされるのですが,大きな落とし穴があり,必ずしも高速で実行されるとは限らない.

つまり,イメージとしては

スレッド作って
ループの処理して
(スレッド終わって)
またスレッド作って
ループの処理して
(スレッド終わって)
またスレッド作って
ループの処理して
(スレッド終わって)
・・・

となるわけです.

こういうときには,

#pragma omp parallel
{
#pragma omp for
for(int i=0;i<max;i++){
}
#pragma omp for
for(int i=0;i<max;i++){
}
・・・
}

とすればよい.イメージとしては

スレッド作って
ループの処理して
ループの処理して
ループの処理して
・・・

となる.

こうすることで,スレッド作成が最初のときだけになり,無駄にスレッド生成を繰り返してしまうことがなくなり,高速化する.

コメントする