`цикл не был векторизован: индекс слишком сложен` в 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?

0 ответов

Другие вопросы по тегам