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