インテル® Fortran コンパイラー 14.0 ユーザー・リファレンス・ガイド
ループに関数呼び出しが含まれる場合、呼び出される関数についてのより詳しい情報がないと、コンパイラーはこのループを並列化できません。
ただし、ループの中で呼び出される関数が要素関数または ATTRIBUTES CONCURRENCY_SAFE を含む関数の場合、その呼び出しはループの並列化の妨げにはなりません。
subroutine foo () integer, parameter :: N2 = 10000 real (8) :: A(N2), B(N2) interface function bar (k) integer :: bar, k end function bar end interface integer :: i do i =1, N2 A(i) = B(i) * bar(N2) end do end subroutine fooこの例では、行 11 のループを並列化するためにはルーチン bar を要素型として宣言する必要があります。
このループを安全に並列化できることが分かっている場合は、次のようにプログラムコードを変更することもできます。
subroutine foo () integer, parameter :: N2 = 10000 real (8) :: A(N2), B(N2) interface function bar (k) !dir$ attributes concurrency_safe : profitable integer :: bar, k end function bar end interface integer :: i do i =1, N2 A(i) = B(i) * bar(N2) end do end subroutine foo