gpt4 book ai didi

optimization - 为什么打开 gfortran 编译器优化后 matmul 变慢?

转载 作者:行者123 更新时间:2023-12-04 03:37:03 25 4
gpt4 key购买 nike

如果我在我的 Mac 上使用 gfortran (Homebrew GCC 8.2.0) 编译下面没有优化的简单程序 (-O0) 调用 matmul 始终在 ~90 毫秒内执行。如果我使用任何优化(标记 -O1-O2-O3),执行时间将增加到 ~250 毫秒。我已经尝试为 inVectmatrix 使用各种不同的大小,但在所有情况下,-O0 选项都优于其他三个优化标志至少 2.5 倍。如果我使用只有几百个元素的较小矩阵,但循环多次调用 matmul,性能损失会更糟,接近 10 倍。

有什么办法可以避免这种行为?我需要在我的代码的某些部分使用优化,但与此同时,我也想尽可能高效地执行矩阵乘法。

我使用命令 gfortran -ON sandbox.f90 编译包含以下代码的文件 sandbox.f90,其中 N 是优化级别 0-3(不使用其他编译器标志)。打印 outVect 的第一个值只是为了防止 gfortran 优化变得聪明并完全跳过对 matmul 的调用。

我是 Fortran 新手,所以如果我在这里遗漏了一些明显的东西,我提前道歉。

program main
implicit none
real :: inVect(20000), matrix(20000,10000), outVect(10000)
real :: start, finish

call random_number(inVect)
call random_number(matrix)

call cpu_time(start)
outVect = matmul(inVect, matrix)
call cpu_time(finish)

print '("Time = ",f10.7," seconds. – First Value = ",f10.4)',finish-start,outVect(1)
end program main

最佳答案

首先,考虑到我可能是错的。我也是第一次看到这个问题,和你一样惊讶。

我刚刚研究了这个问题,我的理解如下。优化-O0 , O3 , Ofast和... 是为大多数一般(常见)情况编写的。然而,在某些情况下(当 -O3 的效率低于 -O*<-O3 时)优化会带来缺陷。这是因为这些优化会隐式调用标志,从而缩短特定任务的执行时间。对于您的情况,-O3除其他外,强加所有matmul()函数将被内联。这样的事情通常是好的,但对于大数组或多次调用此函数不是必需的。不知何故,内联的成本matmul()比内联函数获得的 yield 更重要(至少我是这样看的)。

为了避免这种行为,我建议使用标志 -O3 -finline-matmul-limit=0取消了 matmul 的内联功能。使用标志 -O3 -finline-matmul-limit=0导致执行时间不比为 -O0 获得的执行时间差.

您可以使用 -finline-matmul-limit=n您将在其中内联 matmul仅当涉及的数组小于 n 时才起作用.我用 n=0为简单起见。

希望对您有所帮助。

关于optimization - 为什么打开 gfortran 编译器优化后 matmul 变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66682180/

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