OpenMPI指定1或2个进程时OpenMP多线程无法正常工作
OpenMPI+OpenMP混合并行:少量MPI进程时OpenMP线程无法满负载的问题与解决
问题描述
开发的基于OpenMPI+OpenMP的混合并行代码,当分配的MPI进程数超过2个时运行符合预期;但仅分配1个或2个MPI进程时,OpenMP多线程无法正常工作,CPU占用率停滞在200%(仅使用2个线程)。代码中已通过omp_set_num_threads(5)设置每个MPI进程使用5个线程,预期通过top命令看到每个进程占用500%CPU。
运行环境
- Ubuntu 20.04.4 LTS
- gfortran 13.2.0
- OpenMPI 4.1.5
复现代码
program parallel_example use OMP_LIB implicit none include 'mpif.h' integer :: i, j, k, n, ierror, size_Of_Cluster, process_Rank real :: sum, x call MPI_INIT(ierror) call MPI_COMM_SIZE(MPI_COMM_WORLD, size_Of_Cluster, ierror) call MPI_COMM_RANK(MPI_COMM_WORLD, process_Rank, ierror) call omp_set_dynamic(.False.) call omp_set_num_threads(5) !$OMP PARALLEL print *, 'hello from thread:', OMP_GET_THREAD_NUM(), & & 'of proc=', process_Rank !$OMP END PARALLEL ! Set the number of iterations n = 100000 ! Initialize the sum sum = 0.0 !$omp parallel do collapse(3) default(none) private(i, j, k, x) shared(sum, n) do i = 1, n do j = 1, n do k = 1, n !print *, 'hello from thread:', OMP_GET_THREAD_NUM(), i, j, k x = 1.0 / (real(i) + real(j) + real(k)) !$omp atomic sum = sum + x enddo enddo end do !$omp end parallel do print *, "The sum is: ", sum call MPI_Finalize(ierror) end program parallel_example
编译与运行命令
# 编译命令 mpif90 -fopenmp test.F90 -o app.exe # 运行命令(出现问题的场景) mpirun -np 1 ./app.exe
问题现象
- 执行
mpirun -np 1 ./app.exe或mpirun -np 2 ./app.exe时,目标进程CPU占用率仅维持在200%,未达到预期的500% - 当MPI进程数设置为3及以上(如
mpirun -np 3 ./app.exe)时,每个MPI进程的CPU占用率能达到500%,符合代码设置的线程数预期
解决方案
在mpirun命令中添加进程映射参数--map-by node:pe=N(其中N为每个MPI进程需要使用的OpenMP线程数,此处对应代码中的5),修改后的运行命令如下:
mpirun -np 1 --map-by node:pe=5 ./app.exe
添加该参数后,即使仅使用1个或2个MPI进程,也能正常启用指定数量的OpenMP线程,达到预期的CPU负载。
内容的提问来源于stack exchange,提问作者user23897302
相关产品推荐
相关产品推荐

