英特尔 Fortran 向量化:向量循环成本高于标量
Posted
技术标签:
【中文标题】英特尔 Fortran 向量化:向量循环成本高于标量【英文标题】:Intel Fortran vectorisation: vector loop cost higher than scalar 【发布时间】:2015-07-22 11:35:46 【问题描述】:我正在使用 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
?
【问题讨论】:
你能确认你的intel标签真的是intel-fortran吗?您使用哪个编译器版本以及您使用哪些选项?你有哪个 CPU? 我看不到您的问题,编译器看到了潜在的加速并矢量化了代码。你看哪里有问题?向量操作确实有一些成本,但在这种情况下,成本并不算太高,编译器做了向量化。 是的,我的意思是 intel fortran,使用 ifort 15。据我了解,loop cost 是执行指令所需的时钟周期数,所以我会如果编译器评估估计的潜在加速 > 1,则预计向量循环成本会很小。我哪里错了? 【参考方案1】:循环成本是对一次循环迭代持续时间的估计,在矢量化情况下需要更长的时间,但您可以在一次矢量化迭代中处理更多数组项。
在您的情况下,加速大约是 12 / 20 * 4 = 2.4,因为您可以在一次迭代中处理 4 个双精度数组元素(可能是 AVX 指令)。
【讨论】:
公式(12 / 20 * 4 = 2.4)是正确的,但解释并不完全正确。在给定情况下,展开因子值与 2.4 x 增益估计完全无关。给定公式中的“4” - 可能是向量长度值。因此,给定的循环以 4 倍展开,并在向量长度为 4 的向量化之后。增益估计可能根本不考虑展开,但它考虑了向量长度。 @zam 是的,当然我指的是向量长度。但是它是展开的,因此展开的迭代可以放在一个向量指令中,因此它们是连接的。注意我写“...因为你可以处理 4 双...”,这显然意味着向量长度。 展开因子不会影响 2.34 的值,至少在正常情况下是这样。如果您禁用展开,您通常会得到非常相似的估计。即使展开计算在这个估计中,它也没有被计算为 4 的乘数。这是我的观点。所以展开因素与原始问题无关。 进一步澄清:通过展开 4 并使用 4 的向量长度,通常将 16 次标量迭代放入最终的单个优化循环迭代中。但是,虽然它是 16 次原始迭代对应于最后一次迭代,但每条指令的实际加速大约为 4,因为您在 VPU 寄存器上仅并行处理 4 个值。 @zam 我删除了这句话,但我相信你错了。请参阅software.intel.com/en-us/articles/fdiag15144 循环首先展开然后矢量化。每次迭代只有 4 个元素(在一个向量指令序列中)。以上是关于英特尔 Fortran 向量化:向量循环成本高于标量的主要内容,如果未能解决你的问题,请参考以下文章