インテル(R) コンパイラーの自動並列化機能は、入力プログラムの直列部分を同等のマルチスレッド・コードに自動的に変換します。自動パラレライザーは、アプリケーション・ソース・コード中のループのデータフローを解析して、安全かつ効率的に並列実行可能なループに対するマルチスレッド・コードを生成します。
これにより、対称型マルチプロセッサー (SMP) システムの並列アーキテクチャーを活用できます。
自動並列化は次のようなユーザーの負担を軽減します。
ワークシェアリング候補であるループを見つける。
正しい並列実行を確認するためにデータフロー解析を行う。
OpenMP* 宣言子のプログラミングに必要な場合、スレッドコード生成のデータをパーティショニングする。
並列ランタイムコードは、ループの反復修正、スレッド・スケジューリング、および同期化の詳細を処理するような、OpenMP と同じランタイム機能を提供します。
OpenMP 宣言子はシリアル・アプリケーションを素早く並列アプリケーションに変換できますが、プログラマーは、並列処理を含み、適切なコンパイラー宣言子を追加するアプリケーション・コードの特定部分を明示的に識別する必要があります。
-parallel (Linux*) または /Qparallel (Windows*) オプションで起動された自動並列化は、並列処理を含むループ構造を自動的に識別します。コンパイル中、コンパイラーは、並列処理のためにコードシーケンスを別々のスレッドに自動的に分割しようと試みます。他にプログラマーにかかる負荷はありません。
Itanium ベース・システム: これらのオプションを指定することは -opt-mem-bandwith1 (Linux) または /Qopt-mem-bandwidth1 (Windows) を意味します。
シリアルコードは分割できるので、コードを複数のスレッドで同時に実行することができます。例えば、次のようなシリアルコードの例を考えてみます。
例 1: オリジナルのシリアルコード |
---|
void ser(int *a, int *b, int *c) { for (int i=0; i<100; i++) a[i] = a[i] + b[i] * c[i]; } |
次の例は、2 つのスレッドで同時に実行できるように、前の例で示したループの反復空間を分割する方法を示しています。
例 2: 変換された並列コード |
---|
void par(int *a, int *b, int *c) { int i; // Thread 1 for (i=0; i<50; i++) a[i] = a[i] + b[i] * c[i]; // Thread 2 for (i=50; i<100; i++) a[i] = a[i] + b[i] * c[i]; } |