矢量化一个循环在Fortran与矢量处理器

时间:2015-07-13 08:47:14

标签: fortran cluster-computing vectorization intel gfortran

我正在尝试使用gfortran和Intel Xeon CPU对Fortran程序中的循环进行矢量化。

以前,矢量化是通过设定

来实现的
!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:注意:=== vect_slp_analyze_bb === vect_test.f:18:0:   注意:=== vect_analyze_data_refs === vect_test.f:18:0:注意:不是   vectorized:基本块中没有足够的数据引用。

1 个答案:

答案 0 :(得分:3)

你的程序没用,编译器会优化一切。如果你在最后打印数组的内容并使数组变大,它实际上会向循环进行矢量化:

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.

编译:

dismissViewControllerAnimated:completion: