MST

星途 面试题库

面试题:Fortran并行计算与性能调优

使用Fortran的OpenMP并行化指令,对如下计算密集型代码段进行并行化优化:该代码段计算一个三维数组 `B(100, 100, 100)` 中每个元素的平方和,同时要考虑如何合理设置线程数、数据划分等参数以达到最佳性能,写出优化后的代码并说明优化思路。
26.3万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试
program parallel_sum_squares
    implicit none
    integer, parameter :: n1 = 100, n2 = 100, n3 = 100
    real :: B(n1, n2, n3)
    real :: sum_squares
    integer :: i, j, k
    integer :: num_threads = 4 ! 根据具体硬件合理设置,这里示例设为4

   ! 初始化数组B
    do k = 1, n3
        do j = 1, n2
            do i = 1, n1
                B(i, j, k) = real(i + j + k)
            end do
        end do
    end do

    sum_squares = 0.0
!$omp parallel num_threads(num_threads) reduction(+:sum_squares)
    ! 数据划分采用静态划分,每个线程负责一部分数据
!$omp do collapse(3) schedule(static)
    do k = 1, n3
        do j = 1, n2
            do i = 1, n1
                sum_squares = sum_squares + B(i, j, k) ** 2
            end do
        end do
    end do
!$omp end do
!$omp end parallel

    write(*,*) '平方和为:', sum_squares
end program parallel_sum_squares

优化思路

  1. 线程数设置num_threads 参数设置为4,实际应用中需要根据硬件(如CPU核心数)进行调整。一般来说,线程数不宜超过CPU的物理核心数,避免过多线程带来的调度开销。
  2. 数据划分:使用 collapse(3) 将三维循环合并为一个,然后采用 schedule(static) 静态调度方式,将数据均匀分配给各个线程。这样每个线程在计算时访问的数据相对连续,减少缓存缺失,提高性能。同时,通过 reduction(+:sum_squares) 确保各个线程计算的部分平方和能正确累加到全局变量 sum_squares 上。