可以某人。解释在 Fortran 中传递 pointer
和 allocatable
子程序参数之间的区别?我不明白为什么以下函数在 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/