MST
星途 面试题库

面试题:Fortran OpenMP并行编程之基础并行块

在Fortran中使用OpenMP实现并行计算,假设有一个数组`A`,长度为100,需要对数组中的每个元素进行平方操作,请写出使用`omp parallel do`指令实现该功能的代码片段,并解释`omp parallel do`的工作原理。
24.3万 热度难度
编程语言Fortran

知识考点

AI 面试

面试题答案

一键面试

代码片段

program parallel_square
    use omp_lib
    implicit none
    integer, parameter :: n = 100
    real :: A(n)
    integer :: i

   ! 初始化数组A
    do i = 1, n
        A(i) = real(i)
    end do

   !$omp parallel do
    do i = 1, n
        A(i) = A(i) * A(i)
    end do
   !$omp end parallel do

   ! 输出结果
    do i = 1, n
        write(*,*) 'A(', i, ') = ', A(i)
    end do
end program parallel_square

omp parallel do工作原理

  1. 并行区域创建:当程序执行到!$omp parallel do指令时,OpenMP运行时系统会创建一个并行线程团队。线程的数量通常由运行时环境(如设置OMP_NUM_THREADS环境变量)或系统默认配置决定。
  2. 任务分配omp parallel do指令会将do循环的迭代分配给并行线程团队中的各个线程。每个线程负责处理一部分迭代。例如,如果有4个线程,而循环有100次迭代,每个线程大约负责25次迭代(实际分配可能因调度策略而略有不同)。
  3. 同步与协作:在线程执行完分配给自己的迭代后,线程会在!$omp end parallel do处同步。这意味着所有线程都完成各自的任务后,程序才会继续执行后续代码。这样可以确保数组A的平方操作全部完成后再进行其他操作,避免数据竞争和不一致问题。
  4. 负载均衡:OpenMP提供了不同的调度策略(如静态、动态、引导等)来优化循环迭代的分配,以实现负载均衡。例如,静态调度会预先将迭代平均分配给线程,而动态调度会根据线程完成任务的情况动态分配新的迭代,从而更好地适应不同迭代执行时间差异较大的情况。