MST

星途 面试题库

面试题:Fortran代码重构之循环优化

假设有一段Fortran代码,其中包含一个循环用于计算数组元素的平方和。原始代码如下: ```fortran program sum_of_squares implicit none integer, parameter :: n = 100 real :: a(n), sum integer :: i do i = 1, n a(i) = real(i) end do sum = 0.0 do i = 1, n sum = sum + a(i) * a(i) end do write(*,*) 'The sum of squares is:', sum end program sum_of_squares ``` 请从代码重构的角度,对这个循环部分进行优化,提高代码的执行效率,并解释优化的思路。
26.0万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

优化后的代码

program sum_of_squares
    implicit none
    integer, parameter :: n = 100
    real :: a(n), sum
    integer :: i

    ! 使用数组构造函数初始化数组
    a = [(real(i), i = 1, n)]

    sum = 0.0
    ! 使用矢量化操作计算平方和
    sum = sum + dot_product(a, a)

    write(*,*) 'The sum of squares is:', sum
end program sum_of_squares

优化思路

  1. 数组初始化优化
    • 原始代码使用do循环逐个给数组a赋值,优化后使用数组构造函数[(real(i), i = 1, n)],这种方式在Fortran中更简洁,并且一些编译器可以对数组构造函数进行更好的优化,可能带来性能提升。
  2. 计算平方和优化
    • 原始代码使用do循环逐个计算数组元素的平方并累加。优化后使用dot_product函数,该函数是Fortran标准库提供的用于计算两个向量点积的函数。在计算平方和时,相当于向量a与自身的点积。许多现代Fortran编译器能够对dot_product函数进行矢量化优化,充分利用多核CPU或GPU的并行计算能力,从而显著提高计算效率。相比普通的do循环,dot_product函数的优化潜力更大,尤其是在处理大规模数组时。