multithreading - 使用 Open MP 将多个线程分配给 Xeon Phi 上的单个并行执行

标签 multithreading fortran openmp intel-fortran xeon-phi

我有一些与此类似的代码:

!$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 倍以上。

最佳答案

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

如果您想使用 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

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

关于multithreading - 使用 Open MP 将多个线程分配给 Xeon Phi 上的单个并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830827/

相关文章:

c - OpenMP Monte_Carlo 模拟实现目标与 PI 的接近度

java - 以原子方式递增存储在 ConcurrentHashMap 中的计数器

.net - CLI库代码Thread Safe中的Comparer类是否安全?

.net - 使用线程VB调用Web服务时,发生InvalidOperationException。网

c++ - 尽管并行编译,Mex 文件还是串行执行

c - 使用 C 和 gcc 的 OpenMP omp_set_num_threads() 无效

c - 任务分解

fortran - 函数返回类型不匹配

c - 将接口(interface)模块程序从 Fortran 导入到 C 中

Fortran 运行时警告 : temporary array