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