1

我有一个程序,即使使用了 pragma,对子 例程的调用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 上?),例如,您可以在其中同时进行四次乘法。但是对于同时执行的过程,您可能应该使用线程进行并行化,或者您应该在子例程中搜索向量化的潜力。

--edit-- 当我检查网络参考时,编译器供应商确实总是有类似的例子

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

所以里面没有调用,只是一个简单的计算。为了确定发生了什么,您还应该发布子程序的代码。

于 2012-09-19T07:39:41.543 回答