2015-07-21 118 views
0

我想用矢量處理器(Intel Xeon)以矢量方式執行Fortran循環。我最近用英特爾編譯器做了這件事,我們可以在循環之前添加!DIR$ SIMDgfortran編譯器的強制矢量化

但是,當我使用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也是類似的方式。

+0

你能擺脫IKLE(IELEM)嗎?沒有我知道的gfortran指令。您可能需要OpenMP 4.0中的SIMD指令。我通常不會將英特爾處理器稱爲「矢量」。 –

+0

是的,我也做到了這一點,並發現它的工作原理。但不幸的是我無法擺脫它,這是計算的一部分。 – Shiyu

+0

你確定你的ifort有任何加速嗎?如果你授權它,它會矢量化甚至是無法盈利的循環矢量化。 –

回答

0

在這種情況下,使用分散存儲時,通過指令強制向量化可能會在索引數組IKLE(:)中存在重複條目時更改結果,因爲它不保留內存訪問序列。據我所知,gfortran中唯一可用的指令是!$ omp simd,gfortran可以自由忽略。僅當設置了相應的編譯選項時,omp simd指令才處於活動狀態。 ifort在最新版本中提供了(-opt-report4)可以通過向量化評估峯值加速。我不知道這個評估是否基於聲明的數組大小。如果有一個加速比,通過改變操作序列比通過實際的SIMD並行性可以實現更多。

+0

ifort和gfortran生成的指令序列確保存儲的順序,以防重複。在avx512中有衝突解決指令可供需要的情況下使用。 – tim18