英特尔 Fortran 矢量化:矢量循环成本高于标量
Intel Fortran vectorisation: vector loop cost higher than scalar
我正在使用 Intel Fortran 15 测试和优化遗留代码,我有这个简单的循环:
do ir=1,N(lev)
G1(lev)%D(ir) = 0.d0
G2(lev)%D(ir) = 0.d0
enddo
其中 lev
等于某个整数。
结构和索引对于编译器来说相当复杂,但它可以成功完成任务,正如我在其他行中看到的那样。
现在,在上面的循环中,我从编译报告中得到:
LOOP BEGIN at MLFMATranslationProd.f90(38,2)
remark #15399: vectorization support: unroll factor set to 4
remark #15300: LOOP WAS VECTORIZED
remark #15462: unmasked indexed (or gather) loads: 2
remark #15475: --- begin vector loop cost summary ---
remark #15476: scalar loop cost: 12
remark #15477: vector loop cost: 20.000
remark #15478: estimated potential speedup: 2.340
remark #15479: lightweight vector operations: 5
remark #15481: heavy-overhead vector operations: 1
remark #15488: --- end vector loop cost summary ---
LOOP END
我的问题是:矢量循环成本 怎么比标量循环高?我该怎么做才能实现 estimated potential speedup
?
循环成本 是对一次循环迭代持续时间的估计,在矢量化情况下需要更长的时间,但您可以在一次矢量化迭代中处理更多数组项。
在您的情况下,加速大约为 12 / 20 * 4 = 2.4,因为您可以在一次迭代中处理 4 个双精度数组元素(可能是 AVX 指令)。
我正在使用 Intel Fortran 15 测试和优化遗留代码,我有这个简单的循环:
do ir=1,N(lev)
G1(lev)%D(ir) = 0.d0
G2(lev)%D(ir) = 0.d0
enddo
其中 lev
等于某个整数。
结构和索引对于编译器来说相当复杂,但它可以成功完成任务,正如我在其他行中看到的那样。 现在,在上面的循环中,我从编译报告中得到:
LOOP BEGIN at MLFMATranslationProd.f90(38,2)
remark #15399: vectorization support: unroll factor set to 4
remark #15300: LOOP WAS VECTORIZED
remark #15462: unmasked indexed (or gather) loads: 2
remark #15475: --- begin vector loop cost summary ---
remark #15476: scalar loop cost: 12
remark #15477: vector loop cost: 20.000
remark #15478: estimated potential speedup: 2.340
remark #15479: lightweight vector operations: 5
remark #15481: heavy-overhead vector operations: 1
remark #15488: --- end vector loop cost summary ---
LOOP END
我的问题是:矢量循环成本 怎么比标量循环高?我该怎么做才能实现 estimated potential speedup
?
循环成本 是对一次循环迭代持续时间的估计,在矢量化情况下需要更长的时间,但您可以在一次矢量化迭代中处理更多数组项。
在您的情况下,加速大约为 12 / 20 * 4 = 2.4,因为您可以在一次迭代中处理 4 个双精度数组元素(可能是 AVX 指令)。