パフォーマンス測定法
並列処理プログラミングでは、パフォーマンスを測定するのが大変困難です。ですから、並列処理対応のパフォーマンス測定ツールを使用することをお勧めします。しかし、ちょっとしたプログラムのパフォーマンスを自分で測定したい時があるかと思います。その時の注意点を述べます。
OpenMPでの鉄則は、omp_get_wtime
関数を使用することです。その理由は、既存の関数はマルチスレッドに対応していないからです。例えば、逐次プログラミングではGetTickCount64
関数を使用することが多いでしょう。しかしこの関数は、他のスレッドから割り込みされた場合に正しい時間を計測することができません。その他に考えられる関数はGetThreadTimes
関数です。しかしこの関数は1つのスレッドの処理時間しか計測できません。OpenMPは抽象化されており、いくつのスレッドが生成されるのか分かりません。これらのことを考慮すると、OpenMPを使用した並列プログラムで処理時間を計測する際には、OpenMPに用意されたomp_get_wtime
関数を使うことになります。
今後便利で高精度なAPIが登場するかもしれませんが、その時までomp_get_wtime
を使用することをお勧めします。
まとめ
今回はOpenMPを正しく使用するために、メモリモデルと採用されている並列処理を紹介しました。また、OpenMPでのパフォーマンス測定法について書きました。OpenMPを従来のマルチスレッドプログラミングと比べると、使いやすく便利なのは確かです。しかし、どのような道具も正しい知識を持たねば、使いこなすことはできません。この記事をもとに思考錯誤を繰り返し、OpenMPの正しい使い方をマスターすることをお勧めします。
次回は、より高度なOpenMPの概念を解説します。お楽しみに。
参考資料
- MSDN 「OpenMP in Visual C++」
- OpenMP公式Webページ
- 『OpenMP入門』 北山洋幸 著、秀和システム、2009年8月