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

allocatable function parameters and automatic vectorization

可以某人。解释在 Fortran 中传递 pointerallocatable 子例程参数的区别?我不明白为什么以下函数在 gfortran 7.2 中 not 向量化:

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

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

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

使用 pointer 时,gfortran 报告矢量化成本高得多。那么参数的传递方式是否存在重要差异(例如,间接、指向指针的指针与按值传递),或者这是一个 gfortran 问题?

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

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

但是,可以为数组指针赋予 contiguous 属性。这样的数组是连续的。对该指针的限制是它可能是仅与连续目标关联的指针。

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