0

我在尝试使用 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被矢量化,它运行得确实更快,给出正确的结果。

提到相同的代码在英特尔编译器的实际版本(即15 )上编译并按预期工作可能很有用。

它只是一个编译器问题吗?

无论如何,我可以让它与 14.0.2 版本一起使用吗?

4

0 回答 0