プログラムのパフォーマンス解析

1. ループ中に手続き呼び出しがあります。

ループ中にマルチスレッドで動作すると安全でない手続き呼び出しが含まれているので、並列化できません。このようなループを並列化すると、ループの複数のコピーによって関数呼び出しが同時にインスタンス化され、この関数に固有の変数や戻り値に悪影響を与えたり、関数の目的を無効にする可能性があります。このループ中の手続き呼び出しがマルチスレッドで使用しても安全なことがわかっている場合は、ループ本体の前に DOALLプラグマを追加することにより、このループを無条件に並列化するよう指示できます。たとえば、foo がマルチスレッドで使用しても安全な関数呼び出しである場合、c$par DOALL を挿入することによって、強制的な並列化を指定できます。


c$par DOALL
     do 19 i = 1, n*n
        do 29 k = i, n*n
            a(i) = a(i) + x*b(k)*c(i-k)
            call foo()
 29     continue
 19  continue

コンパイラは -parallel または -explicitpar を指定してコンパイルした場合に限り、DOALL プラグマを解釈します。-autopar を指定してコンパイルすると、DOALLプラグマは無視されます。