Can sb. expliquer la différence entre les paramètres de sous-routine pointer
et allocatable
dans Fortran? Je ne comprends pas pourquoi la fonction suivante ne pas vectoriser dans gfortran 7.2:paramètres de fonction allouables et vectorisation automatique
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
alors qu'il fait vectoriser (comme dans C) si j'utilise allocatable
attribut pour l'argument fsm
factice. Je Compile en utilisant la ligne de commande suivante
gfortran -mavx -O3 -ftree-vectorize -c loops.f90 -fopt-info-vec-note
Lors de l'utilisation pointer
gfortran fait état d'un coût beaucoup plus élevé de vectorisation. Donc, y a-t-il une différence importante dans la façon dont les arguments sont passés (par exemple, indirection, pointeur vers le pointeur vs passant par la valeur), ou est-ce un problème de gfortran?
Si vous ajoutez l'attribut 'contiguous' à la version du pointeur, est-il vectorisé? – francescalus
Stupide, pensé à la forme supposée au lieu de allocatable. Je pense que francescalus pourrait avoir raison. Essayez aussi un tableau de formes supposé '(:)' et un tableau de formes explicite '(n)'. Vous pourriez observer une différence similaire. –
@francescalus en effet, ça le fait :) merci! – angainor