是否有明确的理由说明该循环不会向量化?

时间:2019-06-05 21:30:01

标签: fortran vectorization intel intel-fortran

我正在评估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。

0 个答案:

没有答案