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