2015-07-21 4 views
0

Я хочу выполнить цикл 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.

+0

Можете ли вы избавиться от IKLE (IELEM)? Я не знаю такой директивы gfortran, о которой я знаю. Вам может понадобиться директива SIMD из OpenMP 4.0. Обычно я не рассматривал процессоры Intel как «векторные». –

+0

Да, я тоже это сделал и нашел, что он работает. Но, к сожалению, я не могу избавиться от него, это часть расчета. – Shiyu

+0

У вас есть ускорение с ifort? Если вы это зададите, он будет векторизовать даже петли, которые не выгодно векторизовать. –

ответ

0

В этом случае с хранилищами рассеяния форсирование векторизации по директиве может изменить результаты при повторных вхождениях в индексный массив IKLE (:), поскольку он не сохраняет последовательность доступа к памяти. Насколько мне известно, единственная директива такого характера, доступная в gfortran, - это $ omp simd, которую gfortran может игнорировать. Директивы omp simd активны только тогда, когда установлены соответствующие параметры компиляции. ifort предлагает (-opt-report4 в последних версиях) оценку максимального ускорения путем векторизации. Я не знаю, основана ли эта оценка на объявленных размерах массива. Если есть ускорение, это будет достигнуто больше, изменив последовательность операций, чем фактический параллелизм SIMD.

+0

Последовательности инструкций, генерируемые ifort и gfortran, сохраняют порядок хранения в случае повторов. В avx512 есть инструкции по разрешению конфликтов для использования в случае необходимости. – tim18

Смежные вопросы