blog

OpenMP並列プログラミング

OpenMPは共有ストレージ並列設計ライブラリで、特に並列プログラム設計上のマルチコアCPUに適しています。今日はデュアルコアCPUマシンでOpenMPの並列プログラミングを試してみて、想像を超えた効...

Sep 4, 2017 · 3 min. read
シェア
OpenMPは、共有ストレージの並列設計をサポートするライブラリであり、特にマルチコアCPU上で並列プログラミングに適しています。今日はデュアルコアCPUマシンでOpenMP並列プログラミングを試してみて、想像を超える効率であることがわかったので、あなたと共有するために書き出します。
VC8.0のプロジェクトのプロパティ・ダイアログ・ボックスで、左ボックスの「構成プロパティ」の「C/C++」の「言語」ページで、OpenMPサポートを「に変更します。
簡単なOpenMPアプリケーションから始めましょう。
int main(int argc, char* argv[]) 
{ 
#pragma omp parallel for 
     for (int i = 0; i < 10; i++ ) 
     { 
         printf("i = %d/n", i); 
     } 
     return 0; 
} 
このプログラムの実行後、以下の結果が出力される: 
i = 0 
i = 5 
i = 1 
i = 6 
i = 2 
i = 7 
i = 3 
i = 8 
i = 4 
i = 9 
forループ文の内容が並列に実行されていることがわかります。
pragmaomp並列 for文は、後続のforループが並列に実行されることを指定するために使用されますが、もちろん、forループの内容は並列に実行できるという要件を満たさなければならない、つまり、各ループが他のループから独立しており、後続のループが前のループに依存しないことが重要です。
この文の具体的な意味と関連するOpenMPの命令や一時的に脇に置くの導入の 関数については#プラグマオンプパラレルについては 、限り、あなたは、このステートメントが並列実行にforループの内容が続くことを知っている行になります。
forループ内のステートメントを並列化することで効率が向上するのか、これが最も重要な懸念事項だと思います。これをテストするための簡単なテストプログラムです:
void test() 
{ 
     int a = 0; 
     clock_t t1 = clock(); 
     for (int i = 0; i < 100000000; i++) 
     { 
         a = i+1; 
     } 
     clock_t t2 = clock(); 
     printf("Time = %d/n", t2-t1); 
} 
  
int main(int argc, char* argv[]) 
{ 
     clock_t t1 = clock(); 
#pragma omp parallel for 
     for ( int j = 0; j < 2; j++ ){ 
         test(); 
     } 
     clock_t t2 = clock(); 
     printf("Total time = %d/n", t2-t1); 
  
     test(); 
     return 0; 
} 
  
test()関数では、1億サイクルの実装で、主に長い演算を行うために使用した。 
main()関数では、ループ内で最初にtest()関数を呼び出しているが、わずか2サイクル、デュアルコアCPUでの結果を見てみよう: 
Time = 297 
Time = 297 
Total time = 297 
Time = 297 

forループ内の2つのtest()関数の呼び出しに297msかかっていますが、プリントアウトされた合計時間は297msしかなく、別々に実行されたtest()関数にかかった時間も297msで、並列計算の効率が2倍になっていることがわかります。

Read next

IDC: クラウド・サービスへの戦略的重点のシフト:アジアのクラウド導入は再形成される

IDCは、2014年には、クラウドサービス分野の3つの主要な側面(Infrastructure-as-a-Service、Platform-as-a-Service、Software-as-a-Service)における主要な戦略的シフトが、アジアにおけるクラウド導入の初期段階を再構築し始めると予測しています。

Aug 28, 2017 · 3 min read