並列処理: 概要

ここでは、 インテル® Fortran コンパイラのサポートする並列プログラミングの主要機能である OpenMP*、自動並列化、ベクトル化の自動処理について説明します。これらの機能はそれぞれ、プロセッサ数、ターゲット・アーキテクチャ (IA-32 または Itanium® アーキテクチャ)、アプリケーションの性質に応じて、アプリケーションのパフォーマンスの向上を実現します。OpenMP、自動並列化、ベクトル化の自動処理の 3 つの機能を任意に組み合わせることによって、アプリケーション・パフォーマンスを高めることもできます。

並列プログラミングを明示的に行う場合は、プログラマが OpenMP ディレクティブを使用して定義します。また、暗黙的に行う場合は、コンパイラにより自動検出されます。暗黙的な並列処理は、最も外側のループの自動並列化、または内側のループのベクトル化自動処理のいずれか (または両方) により行われます。

OpenMP と自動並列化のディレクティブで定義される並列処理は、 スレッドレベルの並列処理 (TLP) に基づくものです。ベクトル化の自動処理手法により定義される並列処理は、命令レベルの並列処理 (ILP) に基づきます。

インテル Fortran コンパイラは、マルチプロセッサ・システム向けの IA-32 と Itanium の両アーキテクチャ上、ならびに、ハイパー・スレッディング・テクノロジ搭載の単一 IA-32 プロセッサ上で、OpenMP と自動並列化をサポートします (ハイパー・スレッディング・テクノロジについては、『IA-32 インテル® アーキテクチャ最適化リファレンス・マニュアル』(英語) を参照してください)。ベクトル化の自動処理は、Pentium® ファミリ、MMX® テクノロジ Pentium® プロセッサ、Pentium II プロセッサ、Pentium III プロセッサ、および Pentium 4 プロセッサでサポートされています。ベクトル化の自動処理を使ってコードのコンパイル処理を強化するために、ベクトライザ・ディレクティブをプログラムに追加することもできます。Itanium ベース・システムではこれに関連したソフトウェアのパイプライン化 (SWP) という手法が提供されています。

下記の表は、インテル Fortran コンパイラで利用可能な並列処理の各種実装方法の概要を示します。

並列処理

明示的

暗黙的

ユーザによってプログラミングされる並列処理

コンパイラおよびユーザ指定のヒントによって生成される並列処理

OpenMP (TLP)

IA-32 および Itanium アーキテクチャ

最も外側のループの自動並列化 (TLP)

IA-32 および Itanium アーキテクチャ

最も内側のループのベクトル化自動処理 (ILP)

IA-32 のみ

Itanium アーキテクチャ向けソフトウェアのパイプライン化

サポートするシステム

サポートするシステム

IA-32 または Itanium ベースによるマルチプロセッサ・システム

ハイパー・スレッディング・テクノロジ対応の IA-32 システム

Pentium プロセッサ、MMX テクノロジ Pentium プロセッサ、Pentium II プロセッサ、Pentium III プロセッサ、Pentium 4 プロセッサ

並列プログラムの開発

インテル Fortran コンパイラは、www.openmp.org で提供されている OpenMP Fortran バージョン 2.0 API 仕様をサポートしています。OpenMP ディレクティブは、反復のパーティショニング、データの共用、スレッドのスケジューリング、および同期化に関する下位の詳細レベルを処理して、ユーザの負担を軽減します。

インテル Fortran コンパイラの自動並列化機能は、入力プログラムのシリアルな部分を同等のマルチスレッド・コードに自動的に変換します。自動並列化機能は、ワークシェアリング可能なループを特定し、正しい並列実行を確認するためにデータフロー分析を行い、OpenMP ディレクティブを使用したプログラミングに必要な、スレッドコード生成のデータをパーティショニングします。OpenMP と自動並列化アプリケーションでは、マルチプロセッサ・システムおよびハイパー・スレッディング・テクノロジ対応の IA-32 プロセッサ上の共用メモリによるパフォーマンス・ゲインも実現します。

ベクトル化の自動処理機能は、並列で実行できるプログラム内の演算を検出し、シーケンシャル・プログラムをデータ型に応じて、2、4、8、または 16 までの要素を 1 つの演算で処理するように変換します。場合によっては、自動並列化とベクトル化を組み合わせて最良のパフォーマンスを得ることができます。下記のコードでは、TLP は最も外側のループで、ILP は最も内側のループで使用できます。

DO I = 1, 100            !execute groups of iterations in different  
!threads (TLP)
DO J = 1, 32          !execute in SIMD style with multimedia
!extension (ILP)
A(J,I) = A(J,I) + 1
ENDDO
ENDDO

ベクトル化の自動処理は、Pentium プロセッサ、MMX テクノロジ Pentium II プロセッサ、Pentium III プロセッサ、Pentium 4 プロセッサを基にしたシステム上で動作するアプリケーションのパフォーマンスを向上します。

次の表に、ベクトル化の自動処理、自動並列化、OpenMP サポートを有効にするオプションをリストします。

ベクトル化の自動処理 (IA-32 のみ)

-x{K|W|N|B|P}

{K|W|N|B|P} で指定された拡張命令をサポートするプロセッサでのみ動作する専用コードを生成します。

-ax{K|W|N|B|P}

{K|W|N|B|P} で指定される拡張命令専用のコードを 1 つのバイナリ上に生成し、汎用の IA-32 コードも生成します。通常は、汎用コードの方が実行速度が遅くなります。

-vec_report{0|1|2|3|4|5}

ベクトライザの診断メッセージを制御します。詳細は、表の次のサブセクションを参照してください。

自動並列化、IA-32 および Itanium アーキテクチャ

-parallel

自動パラレライザを有効にして、並列で安全に実行できるループのマルチスレッド・コードを生成します。デフォルト: オフ

-par_threshold{n}

ループの並列実行が有効な確率と比較する自動並列化のしきい値を設定します (n=0 から 100)。n=0 は "常に" を意味します。デフォルト: n = 100

-par_report{0|1|2|3}

自動並列化の診断レベルを制御します。
デフォルト: -par_report1

OpenMP、IA-32 および Itanium アーキテクチャ

-openmp

OpenMP ディレクティブに基づいてマルチスレッド・コードを生成する処理を、パラレライザに許可します。デフォルト: オフ

-openmp_report{0|1|2}

OpenMP パラレライザの診断レベルを制御します。デフォルト: /Qopenmp_report1

-openmp_stubs

シーケンシャル・モードで OpenMP プログラムのコンパイルを有効にします。OpenMP ディレクティブが無視され、OpenMP スタブ・ライブラリがリンクされます。デフォルト: オフ

-openmp-parallel の両方がコマンドラインで指定されると、-parallel オプションは、OpenMP ディレクティブを含まないルーチンでのみ有効となります。OpenMP ディレクティブを含むルーチンでは、-openmp オプションのみが有効です。

適切なオプションを選択することには、以下の利点があります。

OpenMP ディレクティブを各自のコードに追加するだけの簡単な処理で、プログラマはシーケンシャル・ プログラムを並列プログラムに変換することができます。次に、コード内の OpenMP ディレクティブの例を示します。

!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

N
UM = FOO(B(i), C(I))
X(I) = BAR(A(I), NUM)
!Assume FOO and BAR have no side effects
ENDDO

自動並列化およびベクトル化の自動処理ディレクティブの例を参照してください。