Я хочу выполнить цикл Fortran векторным способом с помощью векторного процессора (Intel Xeon). Недавно я получил способ сделать это с помощью компилятора Intel ifort, который мы можем добавить !DIR$ SIMD
перед циклом.Мандат-векторизация для gfortran-компилятора
Но когда я работаю с компилятором gfortran, я обнаружил, что все операции векторизации являются автоматическими. Например,
PROGRAM MAIN1
IMPLICIT NONE
DOUBLE PRECISION :: X(100)
INTEGER :: NELEM = 100, NELMAX = 100, LV = 4
INTEGER :: IKLE(100), I, IB, IELEM
DOUBLE PRECISION :: W(100)
DOUBLE PRECISION :: MASKEL(100)
LOGICAL :: MSK = .FALSE.
DO I = 1, 100
X(I) = I
IKLE(I) = I
W(I) = 0
END DO
DO IB = 1,(NELEM+LV-1)/LV
!------------loop to vectorize------------------
DO IELEM = 1+(IB-1)*LV , MIN(NELEM,IB*LV)
X(IKLE(IELEM)) = X(IKLE(IELEM)) + W(IELEM)
ENDDO ! IELEM
!-----------------------------------------------
ENDDO ! IB
PRINT *, X
END PROGRAM
Часть выхода gfortran main1.f -O3 -fopt-info-optimized
печатается ниже
main1.f:18:0: note: not vectorized: not suitable for gather load _33 = x[_32];
main1.f:18:0: note: bad data references.
main1.f:18:0: note: not vectorized: not enough data-refs in basic block.
main1.f:18:0: note: not vectorized: not enough data-refs in basic block.
С выходом программы X является правильным, когда цикл составляется ifort в режиме подмандатной векторизации, мне интересно, если есть также аналогичным образом для gfortran.
Можете ли вы избавиться от IKLE (IELEM)? Я не знаю такой директивы gfortran, о которой я знаю. Вам может понадобиться директива SIMD из OpenMP 4.0. Обычно я не рассматривал процессоры Intel как «векторные». –
Да, я тоже это сделал и нашел, что он работает. Но, к сожалению, я не могу избавиться от него, это часть расчета. – Shiyu
У вас есть ускорение с ifort? Если вы это зададите, он будет векторизовать даже петли, которые не выгодно векторизовать. –