Sun Studio 12: Fortran プログラミングガイド

10.2.3 自動並列化の基準

反復間データ依存性をもたない DO ループは、-autopar によって自動的に並列化されます。自動並列化のための一般的な基準は次のとおりです。

10.2.3.1 見かけの依存性

コンパイラは、コンパイルされたコードを変形するときに、ループ中のデータ依存の原因になりそうな (見かけの) 参照を自動的に取り除きます。このような多数の変換の 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 を参照する内側のループはデータ依存性の原因になるように見えますが、コンパイラはその配列の一時的な専用コピーを作成して、外側のループの反復を依存しないようにしています。

10.2.3.2 自動並列化の抑制要因

自動並列化では、次のいずれかが発生すると、コンパイラはループを並列化しません。

10.2.3.3 入れ子にされたループ

マルチプロセッサシステムでは、もっとも内側のループではなく、ループの入れ子のもっとも外側のループを並列化するのがもっとも効果的です。並列処理は一般にループのオーバーヘッドがかなり大きいため、もっとも外側のループを並列化することでループのオーバーヘッドが最小になり、各プロセッサの処理量が最大になります。自動並列化では、コンパイラは入れ子のもっとも外側のループからループの解析を始め、並列化可能なループが見つかるまで、内側に進んでいきます。入れ子の中でループが 1 つでも並列化されたら、並列ループの中に含まれるループは無視されます。