我有一些类似的代码:
!$dir parallel do
do k = 1, NUM_JOBS
call asynchronous_task( parameter_array(k) )
end do
!$dir end parallel do
我尝试了很多不同的策略,包括
$ micnativeloadex $exe -e "KMP_PLACE_THREADS=59Cx4T OMP_NUM_THREADS=236"
但是,当我用top检查MIC时,我只能使用25%。
我在英特尔文档/论坛和OpenMP论坛上有很多难以找到任何具体帮助,而现在我认为我唯一能够完成59个任务,其中包含4个线程任务是将open-MPI与open-MP结合起来。
有没有人对此有任何经验并有任何前进的建议?我已经运行了236个异步任务,但由于我的任务内存开销,我怀疑59个任务的运行速度比236快4倍。
答案 0 :(得分:3)
KMP_PLACE_THREADS将隐式设置OMP_NUM_THREADS,因此您无需在麦克风环境变量中指定此内容。
如果您想使用每个任务4个线程的59个任务,您可以选择几个选项。
正如您所提到的,您可以使用混合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的另一种可能性。这几乎肯定会对Xeon Phi的总内存消耗更有利。
在这种情况下,您还需要使用OpenMP指令在asynchronous_task
中公开并行性。
在顶级循环中,您可以启动59个任务,然后在asynchronous_task
内部使用4个线程。至关重要的是,您可以在内部公开这种并行性,否则您的性能将无法很好地扩展。
要使用嵌套的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,以便为每个任务使用多个线程。