OpenMP* バージョンをビルドする

OpenMP* バージョンをビルドするには、OpenMP* 並列化を使用するようにサンプル・アプリケーションを変更してから、変更したコードをコンパイルします。次に、アプリケーションを開始して、実行時間とベースラインを比較します。

  1. build_with_openmp プロジェクトをスタートアップ・プロジェクトに設定します。

  2. プロジェクト build_with_openmp で、使用するコンパイラーをインテル® C++ コンパイラーに変更します ([プロジェクト] > [Intel C++ Compiler (インテル® C++ コンパイラー)] > [Use Intel C++ (インテル® C++ を使用)])。

  3. プロジェクト build_with_openmp で、/Qopenmp コンパイラー・オプションが設定されていることを確認します ([プロジェクト] > [プロパティ] > [構成プロパティ] > [C/C++] > [Language [Intel C++] (言語 [インテル® C++])] > [OpenMP Support (OpenMP サポート)] > [Generate Parallel Code (並列コードの生成) (/Qopenmp)])。コンパイラーで OpenMP* 拡張を有効にするには、このオプションを設定する必要があります。

  4. プロジェクト build_with_openmp のソースファイル tachyon.openmp.cpp を開きます。
  5. parallel_thread 関数で次の変更を行います。

    • mboxsize の反復に依存しない値をループの外側に移動します。
    • video->next_frame の有効性チェックを削除します。
      • 並列ループの途中でループを出ることは許可されていません。
      • このチェックで保存した反復は、結果に影響することなく配布されます。
    • 最外 for ループに #pragma omp parallel for を追加して、スレッドごとの作業量を最大化します。
    • tachyon.openmp_solution.cpp に示す変更後のコードと比較してチェックしてみてください。

ビルド後、makefile は自動でサンプルを実行します。

イメージのレンダリングにかかった時間とパフォーマンスのベースラインを比較します。

スレッド数を明示的に設定する場合は、環境変数 OMP_NUM_THREADS=N を設定します (N はスレッド数)。または、omp_lib.h で宣言されている void omp_set_num_threads(int nthreads) 関数を使用します。並列領域が定義される前にこの関数を呼び出していることを確認します。

OpenMP* を使用するオプションはインテル製マイクロプロセッサーおよび互換マイクロプロセッサーの両方で利用可能ですが、両者では結果が異なります。両者の結果が異なる可能性のある OpenMP* 構造および機能の主なリストは次のとおりです。