インテル® コンパイラーの自動並列化機能は、入力プログラムのシリアル部分を同等のマルチスレッド・コードに自動的に変換します。自動並列化機能は、ワークシェアリング候補のループを特定し、正しい並列実行を確認するためにデータフロー解析を行います。また、OpenMP* 宣言子のプログラミングに必要な場合には、スレッドコード生成のデータをパーティショニングします。OpenMP* と自動並列化機能では、マルチプロセッサー・システム、デュアルコア・プロセッサー・システム上の共有メモリーによるパフォーマンス・ゲインも実現します。
自動パラレライザーは、アプリケーション・ソース・コード中のループのデータフローを解析して、安全かつ効率的に並列実行可能なループに対するマルチスレッド・コードを生成します。
これにより、対称型マルチプロセッサー (SMP) システムの並列アーキテクチャーを活用できます。
インテル® コンパイラーのガイド付き自動並列化機能は、並列化を行える可能性のあるシリアルコードの部分を見つけるのに役立ちます。-guide (Linux* OS) または /Qguide (Windows* OS) コンパイラー・オプションを使用して、並列化、ベクトル化、データ変換に関するアドバイスを得られます。
自動並列化は、次のような開発者の負担を軽減します。
ワークシェアリング候補であるループを見つける。
正しい並列実行を確認するためにデータフロー解析を行う。
OpenMP* 宣言子のプログラミングに必要な場合、スレッドコード生成のデータをパーティショニングする。
並列ランタイムコードは、ループの反復修正、スレッド・スケジューリング、および同期化の詳細を処理するような、OpenMP* と同じランタイム機能を提供します。-par-runtime-control (Linux* OS) または /Qpar-runtime-control (Windows* OS) コンパイラー・オプションを使用して、シンボリック・ループ境界のあるループのランタイムチェックを実行するコードを生成できます。 ループは、ループ粒度が並列化しきい値より高い場合、並列実行されます。並列化しきい値は、-par-threshold (Linux* OS) または /Qpar-threshold (Windows* OS) コンパイラー・オプションを使用して設定できます。これは、並列実行が効果的である可能性に基づいてループの自動並列化のしきい値を設定します。
OpenMP* 宣言子はシリアル・アプリケーションを素早く並列アプリケーションに変換できますが、開発者は、並列処理を含み、適切なコンパイラー宣言子を追加するアプリケーション・コードの特定部分を明示的に識別する必要があります。-parallel (Linux* および Mac OS* X) または /Qparallel (Windows*) オプションで起動された自動並列化は、並列処理を含むループ構造を自動的に識別します。コンパイル中、コンパイラーは、並列処理のためにコードシーケンスを別々のスレッドに自動的に分割しようと試みます。ほかに開発者にかかる負荷はありません。
Linux* または Mac OS* X システムで、自動並列化を使用するプログラムを実行するには、プログラムをコンパイルおよびリンクする際に、-parallel コンパイラー・オプションを含める必要があります。
このオプションを使用すると、互換マイクロプロセッサーおよびインテル製マイクロプロセッサーの両方で並列化が有効になります。実行ファイルでは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる可能性があります。また、並列化は、/arch や /Qx (Windows*) または -m や -x (Linux* および Mac OS* X) などの特定のオプションによる影響を受けます。
シリアルコードは分割できるので、コードを複数のスレッドで同時に実行することができます。例えば、次のようなシリアルコードの例を考えてみます。
例 1: オリジナルのシリアルコード |
---|
subroutine ser(a, b, c) integer, dimension(100) :: a, b, c do i=1,100 a(i) = a(i) + b(i) * c(i) enddo end subroutine ser |
次の例は、2 つのスレッドで同時に実行できるように、前の例で示したループの反復空間を分割する方法を示しています。
例 2: 変換された並列コード |
---|
subroutine par(a, b, c) integer, dimension(100) :: a, b, c ! Thread 1 do i=1,50 a(i) = a(i) + b(i) * c(i) enddo ! Thread 2 do i=51,100 a(i) = a(i) + b(i) * c(i) enddo end subroutine par |
ベクトル化の自動処理機能は、並列で実行できるプログラム内の演算を検出し、シーケンシャル・プログラムをデータ型に応じて、2、4、8、または 16 までの要素を 1 つの演算で処理するように変換します。場合によっては、自動並列化とベクトル化を組み合わせて最良のパフォーマンスを得ることができます。下記のコードでは、スレッドレベルの並列処理は最外ループで、命令レベルの並列処理は最内ループで使用できます。
-vec (Linux* OS) または /Qvec (Windows* OS) オプションを使用すると、インテル製マイクロプロセッサーおよび互換マイクロプロセッサーにおいて、デフォルトの最適化レベルでベクトル化が有効になります。ベクトル化により呼び出されるライブラリー・ルーチンは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる可能性があります。また、ベクトル化は、/arch や /Qx (Windows*) または -m や -x (Linux* および Mac OS* X) などの特定のオプションによる影響を受けます。
例 |
---|
DO I = 1, 100 ! Execute groups of iterations in different hreads (TLP) DO J = 1, 32 ! Execute in SIMD style with multimedia extension (ILP) A(J,I) = A(J,I) + 1 ENDDO ENDDO |
OpenMP* 宣言子を各自のコードに追加するだけの簡単な処理で、開発者はシーケンシャル・プログラムを並列プログラムに変換できます。次に、コード内の OpenMP* 宣言子の例を示します。OpenMP* を使用するオプションはインテル製マイクロプロセッサーおよび互換マイクロプロセッサーの両方で利用可能ですが、両者では結果が異なります。両者の結果が異なる可能性のある OpenMP* 構造および機能の主なリストは次のとおりです: ロック (内部的なものおよびユーザーが利用可能なもの)、SINGLE 構造、バリア (暗黙的および明示的)、並列ループ・スケジューリング、リダクション、メモリーの割り当て、スレッド・アフィニティー、バインド。
例 |
---|
!OMP$ PARALLEL PRIVATE(NUM), SHARED (X,A,B,C)
! Defines a parallel region !OMP$ PARALLEL DO ! Specifies a parallel region that ! implicitly contains a single DO directive
DO I = 1, 1000 NUM = FOO(B(i), C(I)) X(I) = BAR(A(I), NUM) ! Assume FOO and BAR have no other effect ENDDO |
最適化に関する注意事項 |
---|
インテル® コンパイラー、関連ライブラリーおよび関連開発ツールには、インテル製マイクロプロセッサーおよび互換マイクロプロセッサーで利用可能な命令セット (SIMD 命令セットなど) 向けの最適化オプションが含まれているか、あるいはオプションを利用している可能性がありますが、両者では結果が異なります。また、インテル® コンパイラー用の特定のコンパイラー・オプション (インテル® マイクロアーキテクチャーに非固有のオプションを含む) は、インテル製マイクロプロセッサー向けに予約されています。これらのコンパイラー・オプションと関連する命令セットおよび特定のマイクロプロセッサーの詳細は、『インテル® コンパイラー・ユーザー・リファレンス・ガイド』の「コンパイラー・オプション」を参照してください。インテル® コンパイラー製品のライブラリー・ルーチンの多くは、互換マイクロプロセッサーよりもインテル製マイクロプロセッサーでより高度に最適化されます。インテル® コンパイラー製品のコンパイラーとライブラリーは、選択されたオプション、コード、およびその他の要因に基づいてインテル製マイクロプロセッサーおよび互換マイクロプロセッサー向けに最適化されますが、インテル製マイクロプロセッサーにおいてより優れたパフォーマンスが得られる傾向にあります。 インテル® コンパイラー、関連ライブラリーおよび関連開発ツールは、互換マイクロプロセッサー向けには、インテル製マイクロプロセッサー向けと同等レベルの最適化が行われない可能性があります。これには、インテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2)、インテル® ストリーミング SIMD 拡張命令 3 (インテル® SSE3)、ストリーミング SIMD 拡張命令 3 補足命令 (SSSE3) 命令セットに関連する最適化およびその他の最適化が含まれます。インテルでは、インテル製ではないマイクロプロセッサーに対して、最適化の提供、機能、効果を保証していません。本製品のマイクロプロセッサー固有の最適化は、インテル製マイクロプロセッサーでの使用を目的としています。 インテルでは、インテル® コンパイラーおよびライブラリーがインテル製マイクロプロセッサーおよび互換マイクロプロセッサーにおいて、優れたパフォーマンスを引き出すのに役立つ選択肢であると信じておりますが、お客様の要件に最適なコンパイラーを選択いただくよう、他のコンパイラーの評価を行うことを推奨しています。インテルでは、あらゆるコンパイラーやライブラリーで優れたパフォーマンスが引き出され、お客様のビジネスの成功のお役に立ちたいと願っております。お気づきの点がございましたら、お知らせください。 改訂 #20110307 |
© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。