2015-07-13 118 views
1

我正嘗試用gfortran和Intel Xeon CPU在Fortran程序中矢量化循環。矢量化Fortran中的循環與矢量處理器

此前,該矢量被constating

!VOCL LOOP,NOVREC 
!DIR$ IVDEP 

這可能對富士通的循環之前已經工作落實。但是這些都不行了。

有沒有人有想法如何矢量化循環。

由於我這個新手,這將是完美的,如果你能證明一個例子來測試結果

下面是我用它來測試它是否工作

 PROGRAM VECT_TEST 
     IMPLICIT NONE 

     INTEGER :: L(10) 
     INTEGER :: I 

     DO I = 1, 10 
      L(I) = I 
     END DO 

!VOCL LOOP,NOVREC 
!DIR$ IVDEP 
     DO I = 1, 10 
      L(I)=L(I) + 1 
     END DO 

     END PROGRAM 

隨着代碼測試命令

gfortran vect_test.f -fopt-info-all -O3 

我喜歡這個

錯誤輸出

vect_test.f:18:0:note:=== vect_slp_analyze_bb === vect_test.f:18:0: note:=== vect_analyze_data_refs === vect_test.f:18:0:note:not vectorized :基本塊中沒有足夠的數據引用。

+0

你可以從這裏開始https://software.intel .com/en-us/articles/Getting-started-with-intel-composer-xe-2013-compiler-pragmas-and-directives https://software.intel.com/sites/default/files/article/301483/ simd.upate.pdf –

+0

是的,我做到了。其實我也試過了!DIR $ SMID也沒用。我會顯示代碼。也許我以錯誤的方式測試它 – Shiyu

+0

閱讀https://software.intel.com/zh-cn/articles/overview-of-vectorization-reports-and-new-vec-report6 –

回答

3

你的程序沒用,編譯器優化了所有的東西。如果您打印數組的內容在最後,使陣列大,它實際上將矢量化的循環:

PROGRAM VECT_TEST 
IMPLICIT NONE 

INTEGER :: L(1024) 
INTEGER :: I 

DO I = 1, 1024 
    L(I) = I 
END DO 

DO I = 1, 1024 
    L(I)=L(I) + 1 
END DO 

PRINT *, L 

END PROGRAM 

編譯:

gfortran vec.f90 -ftree-vectorizer-verbose=1 -O3 

Analyzing loop at vec.f90:13 


Vectorizing loop at vec.f90:13 

vec.f90:13: note: LOOP VECTORIZED. 
Analyzing loop at vec.f90:7 


Vectorizing loop at vec.f90:7 

vec.f90:7: note: LOOP VECTORIZED. 
vec.f90:1: note: vectorized 2 loops in function. 
+0

好吧。此命令不會在我的計算機上打印任何消息,但我使用-fopt-info -O3得到了相同的結果。非常感謝 – Shiyu