首页 文章

使用Open MP在Xeon Phi上将多个线程分配给单个并行Do.

提问于
浏览
2

我有一些类似的代码:

!$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"

但是,当我用顶部检查MIC时,我的使用率只有25% .

我在英特尔文档/论坛和OpenMP论坛上有很多难以找到任何具体帮助,现在我认为我唯一能够完成每项任务的4个线程的59个任务就是结合open-MPI与open-MP .

有没有人对此有任何经验并有任何前进的建议?我一直在运行236个异步任务,但由于我的任务内存开销,我怀疑59个任务的运行速度比236快4倍 .

1 回答

  • 3

    KMP_PLACE_THREADS将隐式设置OMP_NUM_THREADS,因此您无需在麦克风环境变量中指定此项 .

    如果您想使用每个任务4个线程的59个任务,您可以选择几个选项 .

    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

    另一种使用嵌套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,以便为每个任务使用多个线程 .

相关问题