小编Shi*_*iyu的帖子

fortran矢量长度和fortran循环的展开因子

我想用SIMD指令对下面的fortran进行矢量化

!DIR$ SIMD
    DO IELEM = 1 , NELEM
      X(IKLE(IELEM)) = X(IKLE(IELEM)) + W(IELEM)
    ENDDO
Run Code Online (Sandbox Code Playgroud)

我使用了avx2指令.该程序由编译

ifort main_vec.f -simd -g -pg -O2 -vec-report6 -o vec.out -xcore-avx2 -align array32byte
Run Code Online (Sandbox Code Playgroud)

然后我想VECTORLENGTH(n)在之后添加条款SIMD.如果没有这样的条款或n = 2,4,则该信息不提供有关展开因子的信息

如果n = 8,16 , vectorization support: unroll factor set to 2.

我已经阅读了英特尔关于矢量化支持的文章:展开因子设置为xxxx所以我想循环展开到类似:

    DO IELEM = 1 , NELEM, 2
      X(IKLE(IELEM)) = X(IKLE(IELEM)) + W(IELEM)
      X(IKLE(IELEM+1)) = X(IKLE(IELEM+1)) + W(IELEM+1)
    ENDDO
Run Code Online (Sandbox Code Playgroud)

然后2 X进入向量寄存器,2 W进入另一个,进行加法.但VECTORLENGTH的价值如何运作?或许我真的不明白矢量长度是什么意思.

因为我使用avx2指令,对于DOUBLE PRECISION类型X,最大长度是多少?

这是循环组装的一部分,SSE2,VL …

fortran simd vectorization loop-unrolling

4
推荐指数
1
解决办法
493
查看次数

标签 统计

fortran ×1

loop-unrolling ×1

simd ×1

vectorization ×1