Есть ли четкая причина, по которой этот цикл не будет векторизован? - PullRequest
0 голосов
/ 06 июня 2019

Я оцениваю производительность кода Fortran 90. Запуская код через программу Intel Advisor, я вижу, что циклы со следующим стилем не векторизуются. Пример структуры цикла показан в файлах подпрограмм и модулей, описанных ниже.

Код компилируется с помощью компилятора Intel 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. Я пытался заставить vecotoriztion с помощью блока! $ SIMD вокруг цикла.

...