KMP_PLACE_THREADS 将隐式设置 OMP_NUM_THREADS,因此您无需在 mic 环境变量中指定它。
如果你想使用 59 个任务,每个任务有 4 个线程,你有几个选择。
MPI/OpenMP
正如您所提到的,您可以使用混合 MPI/OpenMP 方法。在这种情况下,您将使用每个等级的不同 OpenMP 域。我过去在麦克风上本地运行 mpirun 实现了这一点,如下所示:
#!/bin/bash
export I_MPI_PIN=off
mpirun -n 1 -env KMP_PLACE_THREADS=10c,4t,1o ./scaling : \
-n 1 -env KMP_PLACE_THREADS=10c,4t,11o ./scaling : \
-n 1 -env KMP_PLACE_THREADS=10c,4t,21o ./scaling : \
-n 1 -env KMP_PLACE_THREADS=10c,4t,31o ./scaling : \
-n 1 -env KMP_PLACE_THREADS=10c,4t,41o ./scaling : \
-n 1 -env KMP_PLACE_THREADS=10c,4t,51o ./scaling
这将创建 6 个 MPI 等级,线程显式放置在 CPU 1、11、21、31、41、51 上,每个等级有 40 个 OpenMP 线程。
您必须设计 MPI 代码以将 NUM_JOBS 拆分到您的队伍中,并在asynchronous_task()
.
嵌套的 OpenMP
另一种使用嵌套 OpenMP 的可能性。这几乎肯定会更有利于至强融核的总内存消耗。
在这种情况下,您还需要在asynchronous_task
using OpenMP 指令中公开并行性。
在顶层循环中,您可以启动 59 个任务,然后在asynchronous_task
. 至关重要的是,您可以在内部公开这种并行性,否则您的性能将无法很好地扩展。
要使用嵌套的 OpenMP,您可以使用以下内容:
call omp_set_nested(.true.)
!$OMP parallel do NUM_THREADS(59)
do k = 1, NUM_JOBS
call asynchronous_task( parameter_array(k) )
end do
!$OMP end parallel do
subroutine asynchronous_task()
!$OMP parallel NUM_THREADS(4)
work()
!$OMP end parallel
end subroutine
在这两种用例中,您都需要在任务子例程中使用 OpenMP,以便每个任务使用多个线程。