2017-08-18 5 views
3

Kann jdn. erklären den Unterschied zwischen pointer und allocatable Subroutine Parameter in Fortran? Ich verstehe nicht, warum die folgende Funktion nicht vectorize in gfortran 7.2 tut:zuweisbare Funktionsparameter und automatische Vektorisierung

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 

während es vectorize tut (wie in C), wenn ich allocatable Attribut für das Dummy-fsm Argument verwenden. Ich kompiliere mit der folgenden Befehlszeile

gfortran -mavx -O3 -ftree-vectorize -c loops.f90 -fopt-info-vec-note 

Bei der Verwendung von pointer gfortran berichtet über eine viel höhere Vektorisierung Kosten. Gibt es also einen wichtigen Unterschied in der Art und Weise, wie die Argumente übergeben werden (z. B. Indirection, Pointer to Pointer vs. Passing by Value), oder ist dies ein Problem von gfortran?

+1

Wenn Sie der Pointer-Version das Attribut "contiguous" hinzufügen, vektorisiert es? – francescalus

+0

Dumm, dachte über angenommene Form statt zuordenbar. Ich denke Francescalus könnte Recht haben. Versuchen Sie auch ein angenommenes Form-Array '(:)' und ein explizites Form-Array '(n)'. Sie könnten einen ähnlichen Unterschied beobachten. –

+0

@francescalus in der Tat, das macht es :) danke! – angainor

Antwort

2

Ein Compiler kann möglicherweise besser optimieren, wenn ein Objekt zusammenhängend ist. Die Vektorisierung kann hier beispielsweise auf den Fall beschränkt sein, bei dem bekannt ist, dass das Objekt bei der Kompilierung zusammenhängend ist.

Ein Array, das von einer allocate-Anweisung zugewiesen wird, ist immer zusammenhängend. Ein Dummy-Argument, das ein Zeigerfeld ist, muss nicht zusammenhängend sein. Hier scheint der Unterschied zu beobachten.

Einem Array-Zeiger kann jedoch das Attribut contiguous zugewiesen werden. Ein solches Array ist dann zusammenhängend. Eine Einschränkung für diesen Zeiger besteht darin, dass er möglicherweise nur einem zusammenhängenden Ziel zugeordnet ist.

Ähnliche Erfahrung kann mit angenommenen Shape-Arrays gemacht werden. Arrays mit expliziter Form sind ebenfalls zusammenhängend.