1

プラグマを使用 しても、サブルーチンの呼び出しfooがベクトル化されないプログラムがあります。呼び出しがベクトル化されない理由はわかりません。それはメモリ参照のためですか?IVDEPvec-report3

注:arr1、arr2、arr3はすべて共通のブロックで定義されています

program test
    integer i, j, k, n
    double precision arr1(5, 5, n, n), aar2(5, 5, n, n), aar3(5, n, n, n)
    !DIR$ IVDEP
    do i=1, n
        call foo(arr1(1, 1, i, k), aar2(1, 1, i, k), aar3(1, i, j, k))
    enddo
end

subroutine foo( fooarr1, fooarr2, fooarr3 )
    implicit none
    double precision fooarr1(5, 5), fooarr2(5, 5), fooarr3(5)
    some computations on fooarr1, fooarr2, fooarr3
    fooarr1,fooarr2,fooarr3 gets updated. But there are no vector dependance

return
end
4

1 に答える 1

0

サブルーチンが自明ではなく、インライン化されていない場合、単純に行うことはできません。ベクトル化とは、限定された SIMD 命令のセットを使用することです (ベクトル Cray または NEC を使用していますか、それとも x86 を使用していますか?)。たとえば、4 つの乗算を同時に行うことができます。しかし、プロシージャーを同時に実行するには、おそらくスレッドを使用して並列化するか、サブルーチン内でベクトル化の可能性を探る必要があります。

--編集-- Web リファレンスを確認したところ、コンパイラ ベンダーには常に次のような例があります。

!DIR$ IVDEP
      DO I = 1,N
         A(I) = A(I+1) + 3.0
      END DO

そのため、内部に呼び出しはなく、単純な計算のみです。何が起こっているのかを確認するには、サブルーチンのコードも投稿する必要があります。

于 2012-09-19T07:39:41.543 に答える