可分配的函数参数和自动矢量化

时间:2017-08-18 10:13:41

标签: fortran vectorization gfortran

可以吗。解释在Fortran中传递pointerallocatable子例程参数之间的区别?我不明白为什么以下函数在gfortran 7.2中 vectorize:

subroutine test0(fsm, im)
implicit none
real, dimension(:), pointer :: fsm
integer, intent(in) :: im
integer i

do i = 1,im
   fsm(i) = fsm(i)*2
end do
end subroutine test0

如果我使用allocatable属性作为伪fsm参数,它会进行矢量化(就像在C中一样)。我使用以下命令行编译

gfortran -mavx -O3 -ftree-vectorize -c loops.f90 -fopt-info-vec-note

使用pointer时,gfortran会报告更高的矢量化成本。那么参数的传递方式有一个重要的区别(例如,间接,指针指针与值传递),还是这是一个gfortran问题?

1 个答案:

答案 0 :(得分:2)

当对象连续时,编译器可以更好地进行优化。例如,这里的矢量化可以限于已知对象在编译时是连续的情况。

allocate语句分配的数组始终是连续的。作为指针数组的伪参数不需要是连续的。这似乎是观察到的差异。

但是,可以为数组指针赋予contiguous属性。然后这样的阵列是连续的。对该指针的限制是它可能只是与一个连续目标相关联的指针。

假设形状阵列可能有类似的经验。显式形状数组也是连续的。