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倍になっていることがわかります。



