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