使用矢量处理器在 Fortran 中矢量化循环

Vectorize a loop in Fortran with vector processor

我正在尝试使用 gfortran 和 Intel Xeon CPU.

对 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: not enough data-refs in basic block.

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

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.