可以吗。解释在Fortran中传递pointer
和allocatable
子例程参数之间的区别?我不明白为什么以下函数在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问题?
答案 0 :(得分:2)
当对象连续时,编译器可以更好地进行优化。例如,这里的矢量化可以限于已知对象在编译时是连续的情况。
由allocate
语句分配的数组始终是连续的。作为指针数组的伪参数不需要是连续的。这似乎是观察到的差异。
但是,可以为数组指针赋予contiguous
属性。然后这样的阵列是连续的。对该指针的限制是它可能只是与一个连续目标相关联的指针。
假设形状阵列可能有类似的经验。显式形状数组也是连续的。