gpt4 book ai didi

performance - 在 Intel Fortran 中编译单个源文件与多个源文件

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

我一直在编译一个包含不同文件中的模块和子例程的项目。每个子程序都写在单独的文件中。模块也是如此。然后,我测试将这些文件分别编译为目标文件 (-c),然后与优化标志链接,并使用 cat 合并整个源代码并将相同的过程应用于此单个源文件。我发现,通过编译单个文件生成的可执行文件比通过多个文件生成的可执行文件快大约 40%,尽管这两个文件使用完全相同的标志。我想知道是否有人知道为什么会发生这种情况,以及英特尔 Fortran 编译器上是否有任何标志将多个文件编译为单个文件。

最佳答案

按照@chw21的要求,我创建了一个显示问题的小程序:

program main
use operators
implicit none

integer :: n
real(8), dimension(:,:), allocatable :: a, b, c
integer :: i,j,k

n = 1000

allocate(a(n,n), b(n,n), c(n,n))

call random_number(a)
call random_number(b)

do j = 1, n
do i = 1, n
do k = 1, n
!c(i,j) = c(i,j) + a(k,i) * b(k,j)
c(i,j) = add(c(i,j), mul(a(k,i), b(k,j)))
enddo
enddo
enddo

write(*,*) sum(c)

end program

带有模块:

module operators

contains

function add(a,b) result (c)
real(8), intent(in) :: a, b
real(8) :: c

c = a + b
end function

function mul(a,b) result (c)
real(8), intent(in) :: a, b
real(8) :: c

c = a * b
end function
end module

这个想法是,如果编译器知道这些函数非常小,那么它们通常应该被内联。我用 -O2 做了三个测试:

  1. 单个文件中的完整源代码
  2. 分成两个文件
  3. 使用-ipo(或-flto)分成两个文件

ifort 13.0.0gfortran 5.2.0 在不同机器上的结果是:

Test     |   1.  |   2.  |   3.  
---------+-------+-------+-------
ifort | 1.3s | 15.7s | 1.9s
gfortran | 1.1s | 3.7s | 1.1s

不幸的是,我不知道为什么 ifort 的第 1 次和第 3 次测试之间仍然存在差异......我想,查看生成的代码可以对这个问题有所了解。

更新:时间是通过执行 time ./a.out 测量的,结果是稳定的时间。由于使用ifort -O2进行标准编译,最大指令集应为SSE2(因此,无FMA),处理器最高支持SSE4a(Opteron 6128)。对最新英特尔处理器(最高可达 AVX)的额外测试显示了类似的结果。

一个重要的事情似乎是内部循环缺乏内联和矢量化,这在 IPO 和单文件编译期间应用(请参阅 --opt-report)。此外,IPO 和单文件编译之间的矢量化似乎存在一些差异。

关于performance - 在 Intel Fortran 中编译单个源文件与多个源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910174/

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