OpenMP* バージョンをビルドするには、OpenMP* 並列化を使用するようにサンプル・アプリケーションを変更してから、変更したコードをコンパイルします。次に、アプリケーションを実行して、実行時間とベースラインを比較します。
%make clean
%make clean
OpenMP* #pragma omp parallel および #pragma omp for schedule(dynamic) 宣言子のコメントを外して、並列領域を作成し、for ループ反復を複数のスレッドに分散して実行します。 schedule(dynamic) 節を有効にすると、各スレッドは実行する少数のループ反復を受け取り、その処理を終了すると、また別の少数のループ反復を受け取ります。 アプリケーションの負荷が分散され、各スレッドがビジーに保たれることにより、パフォーマンスが向上します。
並列領域の内側にある return; 行をコメントアウトします。 OpenMP* 並列領域の内側から外側へ分岐することはできません。
並列領域の内側にある ison=0; 行のコメントを外します。 この値を 0 に設定すると、フレームのレンダリングが停止します。
関数の最後の return; 行のコメントを外して、コメントアウトした並列領域の内側の return; 行の代わりにここでリターンします。
%make openmp
イメージのレンダリングにかかった時間とパフォーマンスのベースラインを比較します。
スレッド数を明示的に設定する場合は、環境変数 OMP_NUM_THREADS=N を設定します (N はスレッド数)。 または、omp_lib.h で宣言されている void omp_set_num_threads(int nthreads) 関数を使用します。 並列領域が定義される前にこの関数を呼び出していることを確認します。
OpenMP* を使用するオプションはインテル製マイクロプロセッサーおよび互換マイクロプロセッサーの両方で利用可能ですが、両者では結果が異なります。両者の結果が異なる可能性のある OpenMP* 構造および機能の主なリストは次のとおりです。
ロック (内部的なものおよびユーザーが利用可能なもの)
SINGLE 構造
バリア (暗黙的および明示的)
並列ループ・スケジューリング
リダクション
メモリーの割り当て
スレッド・アフィニティー、バインド