初心者にありがちなミスが,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++){
}
・・・
}
とすればよい.イメージとしては
スレッド作って ループの処理して ループの処理して ループの処理して ・・・
となる.
こうすることで,スレッド作成が最初のときだけになり,無駄にスレッド生成を繰り返してしまうことがなくなり,高速化する.