gpt4 book ai didi

fortran - Fortran 中的向量化总和

转载 作者:行者123 更新时间:2023-12-02 12:13:51 24 4
gpt4 key购买 nike

我正在使用 gfortran-mavx 编译我的 Fortran 代码,并已验证某些指令是通过 objdump 进行矢量化的code>,但我没有获得预期的速度提升,因此我想确保以下参数被矢量化(这条指令大约占运行时的 50%)。

我知道有些指令可以矢量化,而其他指令则不能,所以我想确保可以:

sum(A(i1:i2,ir))

同样,这一行占用了大约 50% 的运行时间,因为我是在一个非常大的矩阵上执行此操作。我可以提供更多关于为什么我这样做的信息,但只要说这是必要的就足够了,尽管我可以在必要时重组内存(例如,我可以将总和作为 sum(A(ir,i1:i2)) 如果可以向量化的话。

这条线是否被矢量化?我怎么知道?如果没有进行矢量化,如何强制矢量化?

编辑:感谢这些评论,我现在意识到我可以通过 -ftree-vectorizer-verbose 检查此求和的矢量化,并发现这不是矢量化。我已将代码重组如下:

tsum = 0.0d0
tn = i2 - i1 + 1
tvec(1:tn) = A(i1:i2, ir)
do ii = 1,tn
tsum = tsum + tvec(ii)
enddo

并且这个在我打开-funsafe-math-optimizations时进行矢量化,但由于矢量化,我确实看到速度又提高了 70%。问题仍然存在:为什么 sum(A(i1:i2,ir)) 不矢量化以及如何获得简单的 sum 进行矢量化?

最佳答案

事实证明,除非包含 -ffast-math-funsafe-math-optimizations,否则我无法使用矢量化。

我使用的两个代码片段是:

tsum = 0.0d0
tvec(1:n) = A(i1:i2, ir)
do ii = 1,n
tsum = tsum + tvec(ii)
enddo

tsum = sum(A(i1:i2,ir))

这是我使用不同编译选项运行第一个代码片段时得到的时间:

10.62 sec ... None
10.35 sec ... -mtune=native -mavx
7.44 sec ... -mtune-native -mavx -ffast-math
7.49 sec ... -mtune-native -mavx -funsafe-math-optimizations

最后,通过这些相同的优化,我可以对 tsum = sum(A(i1:i2,ir)) 进行矢量化以获得

 7.96 sec ... None
8.41 sec ... -mtune=native -mavx
5.06 sec ... -mtune=native -mavx -ffast-math
4.97 sec ... -mtune=native -mavx -funsafe-math-optimizations

当我们将 sum-mtune=native -mavx-mtune=native -mavx -funsafe-math-optimizations 进行比较时,显示出约 70% 的加速。 (请注意,这些仅运行一次 - 在我们发布之前,我们将对多次运行进行真正的基准测试)。

不过我确实受到了一点打击。当我使用 -f 选项时,我的值会略有变化。如果没有它们,我的变量(v1v2)的错误是:

v1 ... 5.60663e-15     9.71445e-17     1.05471e-15
v2 ... 5.11674e-14 1.79301e-14 2.58127e-15

但是通过优化,错误是:

v1 ... 7.11931e-15     5.39846e-15     3.33067e-16
v2 ... 1.97273e-13 6.98608e-14 2.17742e-14

这表明确实发生了一些不同的事情。

关于fortran - Fortran 中的向量化总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com