我想用矢量處理器(Intel Xeon)以矢量方式執行Fortran循環。我最近用英特爾編譯器做了這件事,我們可以在循環之前添加!DIR$ SIMD
。gfortran編譯器的強制矢量化
但是,當我使用gfortran編譯器時,我發現所有的矢量化操作都是自動的。例如,gfortran main1.f -O3 -fopt-info-optimized
輸出的
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
部分被印刷下面
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指令。您可能需要OpenMP 4.0中的SIMD指令。我通常不會將英特爾處理器稱爲「矢量」。 –
是的,我也做到了這一點,並發現它的工作原理。但不幸的是我無法擺脫它,這是計算的一部分。 – Shiyu
你確定你的ifort有任何加速嗎?如果你授權它,它會矢量化甚至是無法盈利的循環矢量化。 –