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"

但是,当我用 top 检查 MIC 时,我只得到了 25% 的使用率。

我很难在英特尔文档/论坛和 OpenMP 论坛中找到任何具体的帮助,现在我认为我唯一能有 59 个任务和 4 个线程处理每个任务的方法就是结合 open-MPI带开放式 MP。

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

4

1 回答 1

3

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_taskusing 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,以便每个任务使用多个线程。

于 2014-11-09T18:18:07.520 回答