OpenMP* バージョンをビルドするには、OpenMP* 並列化を使用するようにサンプル・アプリケーションを変更してから、変更したコードをコンパイルします。次に、アプリケーションを実行して、実行時間とベースラインを比較します。
ターミナルセッションで次のコマンドを実行して、シリアルバージョンのビルド時に作成されたファイルをすべて削除します。
%make clean
thread_for 関数で次の操作を行います。
mboxsize の反復に依存しない値をループの外側に移動します。
並列ループの途中でループを出ることは許可されていません。
このチェックで保存した反復は、結果に影響することなく配布されます。
video->next_frame の有効性チェックを削除します。
最外 for ループに #pragma omp parallel for を追加して、スレッドごとの作業量を最大化します。
tachyon.openmp_solution.cpp に示す変更後のコードと比較してチェックしてみてください。
ターミナルセッションで次のコマンドを実行してサンプルをビルドします。
%make openmp
ビルド後、makefile は自動でサンプルを実行します。
イメージのレンダリングにかかった時間とパフォーマンスのベースラインを比較します。
スレッド数を明示的に設定する場合は、環境変数 OMP_NUM_THREADS=N を設定します (N はスレッド数)。または、omp_lib.h で宣言されている void omp_set_num_threads(int nthreads) 関数を使用します。並列領域が定義される前にこの関数を呼び出していることを確認します。
OpenMP* を使用するオプションはインテル製マイクロプロセッサーおよび互換マイクロプロセッサーの両方で利用可能ですが、両者では結果が異なります。両者の結果が異なる可能性のある OpenMP* 構造および機能の主なリストは次のとおりです。
ロック (内部的なものおよびユーザーが利用可能なもの)
SINGLE 構造
バリア (暗黙的および明示的)
並列ループ・スケジューリング
リダクション
メモリー割り当て
スレッド・アフィニティー、バインド