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

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 问题?

最佳答案

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

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

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

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

关于fortran - 可分配的函数参数和自动矢量化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45754158/

10-13 09:08