выделяемые параметры функций и автоматическая векторизация
Может СБ. объясните разницу между передачей параметров подпрограмм 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 ответ:
Компилятор может лучше оптимизировать, когда объект смежен. Векторизация здесь может, например, ограничиваться случаем, когда известно, что объект является непрерывным при компиляции.
Массив, выделенный оператором
allocate
, всегда является непрерывным. Фиктивный аргумент, представляющий собой массив указателей, не обязательно должен быть непрерывным. Здесь, по-видимому, наблюдается различие.Однако указателю массива может быть присвоен атрибут
contiguous
. Тогда такой массив является непрерывным. Ограничение на этот указатель состоит в том, что он может быть указателем, связанным только с смежной целью.Аналогичный опыт может быть получен с массивами предполагаемой формы. Явные массивы форм также являются смежными.