インテル® Fortran コンパイラー 16.0 ユーザー・リファレンス・ガイド
"%s parallel" 文をループの直前 (行 %d) に挿入して、このループを並列化します。
"!DIR$ PARALLEL" を指定されたループの前に追加します。この宣言子は、想定されるループの繰り返し間のデータ依存を無視して、指定された行のループの並列化を有効にします。
次の例について考えてみます。
void foo(float *a, int m, int n) { int i; for (i=0; i<n; i++) { a[i] = a[i+m]+1; } return; } subroutine foo(a, m, n) real a(n) do i=1,n a(i) = a(i+m) + 1 enddo end
この例では、m についてのより詳しい情報がないと、コンパイラーはこのループを並列化できません。例えば、m がマイナスの場合、各反復は前の反復に依存します。m が n よりも大きいことが分かっていれば、ループを並列化できます。
安全であることが分かっている場合は、次のように宣言子を追加できます。
subroutine foo(a, m, n) real a(n) !dir$ parallel do i=1,n a(i) = a(i+m) + 1 enddo end
ループ内の配列に繰り返し間の依存関係がないことを確認してください。繰り返し間の依存関係は、ループの 1 つの反復でメモリー位置の変更を行い、別の反復でそのフェッチ/ストア操作を行った場合に発生します。