反復間データ依存性をもたない DO ループは、-autopar によって自動的に並列化されます。自動並列化のための一般的な基準は次のとおりです。
明示的な DO ループと、IF ループや Fortran 95 配列構文などの暗黙的なループのみが、並列化されます。
ループの各反復に対する配列変数の値は、そのループのほかの反復に対する配列変数の値に依存してはいけません。
ループ内の計算は、ループの終了後に参照される純スカラー変数を条件によって変更してはいけません。
ループ内の計算は、反復にまたがるスカラー変数を変更してはいけません。これは「ループ伝達の依存性」と呼ばれます。
ループの本文内の処理量は、並列化のオーバーヘッドよりも多くなければいけません。
コンパイラは、コンパイルされたコードを変形するときに、ループ中のデータ依存の原因になりそうな (見かけの) 参照を自動的に取り除きます。このような多数の変換の 1 つは、一部の配列の専用バージョンを使用します。コンパイラがこの処理を行うことができるのは、一般的には、そのような配列が本来のループで一時領域としてのみ使用されていることが判断できる場合です。
例: -autopar を使用しています。専用配列によって依存が取り除かれます。
parameter (n=1000) real a(n), b(n), c(n,n) do i = 1, 1000 <--並列化される do k = 1, n a(k) = b(k) + 2.0 end do do j = 1, n-1 c(i,j) = a(j+1) + 2.3 end do end do end |
前述の例では、外側のループが並列化され、別々のプロセッサ上で実行されます。配列 a を参照する内側のループはデータ依存性の原因になるように見えますが、コンパイラはその配列の一時的な専用コピーを作成して、外側のループの反復を依存しないようにしています。
自動並列化では、次のいずれかが発生すると、コンパイラはループを並列化しません。
DO ループが、並列化される別のループ内の入れ子になっているとき
フロー制御で、DO ループの外に飛び出す可能性があるとき
ループ内で、ユーザーレベルの副プログラムが起動されているとき
ループ内に入出力文があるとき
ループ内の計算が別名付きスカラー変数を変更するとき
マルチプロセッサシステムでは、もっとも内側のループではなく、ループの入れ子のもっとも外側のループを並列化するのがもっとも効果的です。並列処理は一般にループのオーバーヘッドがかなり大きいため、もっとも外側のループを並列化することでループのオーバーヘッドが最小になり、各プロセッサの処理量が最大になります。自動並列化では、コンパイラは入れ子のもっとも外側のループからループの解析を始め、並列化可能なループが見つかるまで、内側に進んでいきます。入れ子の中でループが 1 つでも並列化されたら、並列ループの中に含まれるループは無視されます。