2017-08-18 5 views
3

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?

+1

Si vous ajoutez l'attribut 'contiguous' à la version du pointeur, est-il vectorisé? – francescalus

+0

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. –

+0

@francescalus en effet, ça le fait :) merci! – angainor

Répondre

2

Un compilateur peut mieux optimiser lorsqu'un objet est contigu. La vectorisation ici peut, par exemple, être limitée au cas où l'objet est connu pour être contigu à la compilation.

Un tableau alloué par une instruction allocate est toujours contigu. Un argument factice qui est un tableau de pointeurs n'a pas besoin d'être contigu. Ici semble être la différence observée.

Toutefois, un pointeur de tableau peut avoir l'attribut contiguous. Un tel tableau est alors contigu. Une restriction sur ce pointeur est qu'il peut être associé à un pointeur uniquement avec une cible contiguë.

Une expérience similaire peut être obtenue avec des réseaux de formes supposées. Les tableaux de formes explicites sont également contigus.