выделяемые параметры функций и автоматическая векторизация


Может СБ. объясните разницу между передачей параметров подпрограмм pointer и allocatable в Fortran? Я не понимаю, почему следующая функция не векторизуется в 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

В то время как он векторизуется (как и в C), если я использую атрибут allocatable для фиктивного аргумента fsm. Я компилирую, используя следующую командную строку

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

При использовании pointer gfortran сообщает о гораздо более высокой стоимости векторизации. Так есть ли важная разница в том, как аргументы передаются (например, косвенность, указатель на указатель и передача по значению), или это проблема gfortran?

1 3

1 ответ:

Компилятор может лучше оптимизировать, когда объект смежен. Векторизация здесь может, например, ограничиваться случаем, когда известно, что объект является непрерывным при компиляции.

Массив, выделенный оператором allocate, всегда является непрерывным. Фиктивный аргумент, представляющий собой массив указателей, не обязательно должен быть непрерывным. Здесь, по-видимому, наблюдается различие.

Однако указателю массива может быть присвоен атрибут contiguous. Тогда такой массив является непрерывным. Ограничение на этот указатель состоит в том, что он может быть указателем, связанным только с смежной целью.

Аналогичный опыт может быть получен с массивами предполагаемой формы. Явные массивы форм также являются смежными.