多くの計算がループで実行されるアプリケーションについて、インテル® コンパイラーはそのようなループを識別し、マルチスレッド・バージョンのアプリケーションを自動的に生成することができます。この変換は、マルチコア・プロセッサー・プラットフォーム、ハイパースレッディング・テクノロジー (HT テクノロジー) 対応のマルチコア・プロセッサー・システム向けのアプリケーションを対象にしています。
-parallel (Linux* および Mac OS* X) オプションまたは /Qparallel (Windows*) オプションを使用すると、インテル製マイクロプロセッサーおよび互換マイクロプロセッサーにおいて並列化が有効になります。実行ファイルでは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる可能性があります。また、並列化は、/arch や /Qx (Windows*) または -m や -x (Linux* および Mac OS* X) などの特定のオプションによる影響を受けます。
コンパイラーは、ループ中のデータフローを解析して、安全かつ効率的に並列実行できるループを判断します。自動並列化を行うと、実行時間が短くなることがあります。この自動並列化は、次のような一般的な作業にかかる時間を短縮することができます。
-openmp と -parallel (Linux* および Mac OS* X) または /Qopenmp と /Qparallel (Windows*) コンパイラー・オプションの両方が同じコマンドラインで指定されると、コンパイラーは OpenMP* 宣言子を含まない関数のみを並列化しようとします。
次のプログラムには、反復カウントの高いループが含まれています。
例 |
---|
subroutine no_dep parameter (n=100000000) real a, c(n) do i = 1, n a = 2 * i - 1 c(i) = sqrt(a) enddo print*, n, c(1), c(n) end subroutine no_dep |
コンパイラーのデータフロー解析では、ループに繰り返し間のデータ依存がないことを確認します。コンパイラーは、ランタイム時にスレッド間で、可能な限り反復を平等に分割するコードを生成します。
スレッドの数はデフォルトではプロセッサーの数ですが、OMP_NUM_THREADS 環境変数を使用して設定できます。指定されたループの並列速度の向上は、作業の量、スレッド間のロードバランス、スレッド作成および同期のオーバーヘッドなど、多くの要因に依存しますが、一般的にスレッドの数未満になります。プログラム全体では、速度の向上はシリアル部分に対する並列部分の比率に依存します。
コンパイルとリンクをそれぞれ別のビルドで行う場合、自動並列化を使用するときは、OpenMP* ランタイム・ライブラリーを必ずリンクしてください。この場合、インテル® コンパイラー・ドライバーを使用してリンクすると非常に簡単です。
© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。