自動並列化の概要

インテル(R) コンパイラーの自動並列化機能は、入力プログラムの直列部分を同等のマルチスレッド・コードに自動的に変換します。自動パラレライザーは、アプリケーション・ソース・コード中のループのデータフローを解析して、安全かつ効率的に並列実行可能なループに対するマルチスレッド・コードを生成します。

これにより、対称型マルチプロセッサー (SMP) システムの並列アーキテクチャーを活用できます。

自動並列化は次のようなユーザーの負担を軽減します。

並列ランタイムコードは、ループの反復修正、スレッド・スケジューリング、および同期化の詳細を処理するような、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];

}