インテル® Fortran コンパイラー 16.0 ユーザー・リファレンス・ガイド
%s をルーチン "%s" の宣言に追加して、行 %d のループを並列化します。"%s" を追加することで同様の効果を得ることもできます。
アドバイスに従ってアノテーションを追加する前に、指定されているルーチンが要素関数または ATTRIBUTES CONCURRENCY_SAFE 関数であることを確認してください。
これ以外のルーチンの場合は、FORCEINLINE RECURSIVE 宣言子を使用してインライン展開してみてください。これにより効果が得られることがあります。
次の例について考えてみます。
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
ルーチンがアノテーションのセマンティクスに沿っていることを確認してください。別の方法として、FORCEINLINE RECURSIVE 宣言子を使用してルーチンをインライン展開することでループを並列化することもできます (この方法で必ず並列化されるとは限りません)。