VisualC++ でOpenMPを利用した並列計算
最近のCPUは複数のコアで演算するのが主流となりつつあります。
複数のスレッドを立てて演算するためにOpneMPと呼ばれる並列処理を実現するための仕様を利用します。
OpenMPの利点は,OpenMPが有効ではない環境においては、
コメントと同様に無視されるディレクティブ(OpenMPの場合は「#pragma omp」)を用いるため、
同一のプログラムを使用できる点です。
また、VisualC++ 2008 以降で簡単に利用することができます。
今回は、2~1000000 の素数の数を数えるプログラムにて、並列計算の有用性を確認してみることにします。
VisualC++ + OpenMPのプログラム
////////////////////////////////////////////////////////////////////////// // OpenMPを使用する1 ////////////////////////////////////////////////////////////////////////// #include <iostream> #include <time.h> #include <omp.h> using namespace std; bool prime(int n); int N=100000; int main(){ clock_t time_start, time_end; time_start = clock(); #ifdef _OPENMP //omp_set_num_threads(8); cout << "OpenMPを利用します(最大スレッド数:"<< omp_get_max_threads() << ")"<< endl; #endif int NN=0; #pragma omp parallel { #pragma omp for //schedule(dynamic, 100) for (int n=2; n<=N; ++n) { if (prime(n)) { #pragma omp critical NN++; } } } time_end = clock(); cout <<"2から" << N << "までの素数の個数は " << NN << "です" <<endl; cout <<"計算時間は " << double(time_end - time_start)/double(CLOCKS_PER_SEC) << "です" <<endl; cin.get();//入力待ち return 0; } bool prime(int n){ bool flag = true; for(int i=2; i<n; i++){ if(n%i==0 ){ flag = false; break; } } return flag; }
プログラム中の「#pragma omp critical」は、次の命令を排他処理とします。
実行結果
OpenMPを用いて並列計算をした場合と通常の場合を比較した結果が次の通り。
OpneMP を利用した場合
OpenMPを利用します(最大スレッド数:8) 2から1000000までの素数の個数は 78498です 計算時間は 43.514です
OpneMP を利用しない場合
2から1000000までの素数の個数は 78498です 計算時間は 143.828です
計算時間は約1/3の時間になりました。
有効であることを確認できました。
参考文献
・OpenMPの使い方:tech.ckme.co.jp
・文法からはじめるプログラミング言語Microsoft Visual C++入門
・OpenMPの実行時ライブラリと並列ループ