我正在评估Fortran 90代码的性能。通过英特尔的Advisor程序运行代码,我发现具有以下样式的循环没有被矢量化。循环结构的示例在下面描述的子例程和模块文件中显示。
该代码正在使用Intel的Compiler 19.0.3进行编译 -O3优化已打开
Subroutine SampleProblem
Use GlobalVariables
Implicit None
Integer :: ND, K, LP, L
Real :: AVTMP
! Sample of loop structure that is no vectorized
DO ND=1,NDM
DO K=1,KS
DO LP=1,LLWET(K,ND)
L = LKWET(LP,K,ND)
AVTMP = AVMX*HPI(L)
ENDDO
ENDDO
ENDDO
End Subroutine SampleProblem
LLWET和LKWET是在模块“ GlobalVariables”中声明的可分配数组。像这样:
Module GlobalVariables
Implicit None
! Variable declarations
REAL :: AVMX
INTEGER :: NDM
REAL,ALLOCATABLE,DIMENSION(:) :: HPI
INTEGER,ALLOCATABLE,DIMENSION(:,:) :: LLWET
INTEGER,ALLOCATABLE,DIMENSION(:,:,:) :: LKWET
End Module GlobalVariables
我不明白为什么编译器不会对此循环进行矢量化处理。根据Intel Advisor的报告结果,在他的代码中有很多循环,并且没有一个被矢量化。我已经尝试在循环中用!$ SIMD块强制进行vetotoriztion。