`цикл не был векторизован: индекс слишком сложен` в Intel Fortran с OpenMP
У меня проблема при попытке распараллелить - с OpenMP - и векторизовать вложенный цикл с помощью ifort 14.0.2.
Вот цикл:
!$OMP DO schedule(auto)
do ig1 = 1, N_g
ic1 = (ig1-1) * N_d
do ig2 = 1, N_t
ig2index = T(ig2)
kk = (ig2index-1) * N_d
ix = p1(1) - p2(1); iy =p1(2) - p2(2); iz = p1(3) - p2(3)
!dir$ ivdep
do i = 1, N_d
k = kk + i
c = TL(l)%Fg(ix,iy,iz)%D(i)
Gth(i+ic1) = Gth(i+ic1) + Fth(k)*c
Gph(i+ic1) = Gph(i+ic1) + Fph(k)*c
enddo
enddo
enddo
!$OMP END DO
Когда я пытаюсь запустить параллельно или векторизовать отдельно, все работает как положено; но когда я пытаюсь скомпилировать с -O3 -openmp -axavx -vec-report6
отчет, кажется, игнорирует самый внутренний цикл - тот, что закончился i
и дает мне это сообщение в строке, где c
инициализируется:
remark: loop was not vectorized: subscript too complex
чего я не могу понять
Если -openmp
флаг выключен, зацикливание i
получает векторизацию и работает действительно быстрее, давая правильные результаты.
Возможно, полезно упомянуть, что тот же код скомпилирован и работает, как и ожидалось, с реальной версией компилятора Intel, которая составляет 15.
Это просто проблема компилятора?
Можно ли заставить его работать с версией 14.0.2?