我在尝试使用 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 版本一起使用吗?