在使用OpenMP的英特尔Fortran中,循环没有矢量化:下标过于复杂

时间:2014-12-23 11:56:19

标签: fortran openmp vectorization intel-fortran avx2

我在尝试并行化时遇到问题 - 使用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

当我尝试分别运行parallel或vectorize时,一切都按预期工作;但是当我尝试使用-O3 -openmp -axavx -vec-report6进行编译时,报告似乎忽略了最内层的循环 - i之上的循环,并在c初始化的行中给出了此消息

remark: loop was not vectorized: subscript too complex

我无法理解。

如果-openmp标志被关闭,则i上的循环会被矢量化,并且运行得更快,从而得到正确的结果。

可能有用的是提到编译相同的代码并按照预期的方式使用英特尔编译器的实际版本, 15

这只是一个编译问题吗?

我可以使用14.0.2版本吗?

0 个答案:

没有答案