首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >确保混合MPI / OpenMP在不同的核心上运行每个OpenMP线程

确保混合MPI / OpenMP在不同的核心上运行每个OpenMP线程
EN

Stack Overflow用户
提问于 2017-12-14 20:26:32
回答 2查看 2.3K关注 0票数 7

我正在尝试运行一个混合的OpenMP / MPI作业,以便OpenMP线程被核心(每个内核只有一个线程)分隔。我看到了使用numa-ctl和bash脚本设置环境变量的其他答案,我不想这样做。

我希望仅通过在命令行上设置OMP_NUM_THREADS和或OMP_PROC_BIND和mpiexec选项才能做到这一点。我尝试了以下方法--假设我想要2个MPI进程,每个进程都有2个OpenMP线程,每个线程都运行在不同的核心上,所以我希望总共有4个内核。

代码语言:javascript
运行
复制
OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 

这样就把作业分开了,所以只有两个进程在工作,它们都在同一个CPU上,所以每个进程只使用大约25%的CPU。如果我试着:

代码语言:javascript
运行
复制
OMP_PROC_BIND=false OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2

然后,我只得到两个单独的MPI进程,每个进程的CPU功率都是100%或100%以上,根据top的说法。这似乎没有显示用于OpenMP线程的不同内核。

如何迫使系统将不同的线程放在不同的核心上?

国际印刷公司打印:

代码语言:javascript
运行
复制
-CPU(s):                48
-On-line CPU(s) list:   0-47
-Thread(s) per core:    2
-Core(s) per socket:    12
-Socket(s):             2
-NUMA node(s):          2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-22 17:03:35

实际上,我希望你的第一个例子能奏效。在这里设置OMP_PROC_BIND=true是很重要的,这样当固定OpenMP的线程时,OpenMP就会保持在来自MPI进程的CPU绑定中。

根据批处理系统和MPI实现,可能有非常独立的方法来设置这些东西。

此外,超线程,或者通常每个内核都显示为“核心”的多个硬件线程,可能是问题的一部分,因为当两个进程在一个内核的两个超级线程上运行时,您将永远看不到200%的问题。

这里是一个通用的解决方案,我在为某些MPI和某些系统上的OpenMP实现计算这些东西时使用。有来自Cray的文档,其中包含一个非常的帮助程序来快速解决这些问题,它被称为xthi.c搜索文件名或从这里粘贴它(不确定在这里粘贴它是否合法.)。用下列方法汇编:

代码语言:javascript
运行
复制
mpicc xthi.c -fopenmp -o xthi

现在我们可以看到到底发生了什么,例如,在带有超线程的2x8核心Xeon和基于MPICH的Intel MPI (基于MPICH)上:

代码语言:javascript
运行
复制
$ OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 ./xthi

Hello from rank 0, thread 0, on localhost. (core affinity = 0,16)
Hello from rank 0, thread 1, on localhost. (core affinity = 1,17)
Hello from rank 1, thread 0, on localhost. (core affinity = 8,24)
Hello from rank 1, thread 1, on localhost. (core affinity = 9,25)

正如您所看到的,core意味着一个核心的所有超线程。请注意,默认情况下,mpirun也是如何将它引脚不同的套接字。在OMP_PLACES=threads中,每个核心都有一个线程:

代码语言:javascript
运行
复制
$ OMP_PROC_BIND=true OMP_PLACES=threads OMP_NUM_THREADS=2 mpiexec -n 2 ./xthi
Hello from rank 0, thread 0, on localhost. (core affinity = 0)
Hello from rank 0, thread 1, on localhost. (core affinity = 1)
Hello from rank 1, thread 0, on localhost. (core affinity = 8)
Hello from rank 1, thread 1, on localhost. (core affinity = 9)

关于OMP_PROC_BIND=false (第二个例子),我得到:

代码语言:javascript
运行
复制
$ OMP_PROC_BIND=false OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -n 2 ./xthi
Hello from rank 0, thread 0, on localhost. (core affinity = 0-7,16-23)
Hello from rank 0, thread 1, on localhost. (core affinity = 0-7,16-23)
Hello from rank 1, thread 0, on localhost. (core affinity = 8-15,24-31)
Hello from rank 1, thread 1, on localhost. (core affinity = 8-15,24-31)

在这里,每个OpenMP线程都获得一个完整的套接字,因此MPI级别仍然可以在不同的资源上运行。然而,在一个进程中的OpenMP线程可以由操作系统在所有内核中进行广泛的调度。这与在我的测试系统上设置OMP_NUM_THREADS=2是一样的。

同样,这可能取决于特定的OpenMP和MPI实现和版本,但我认为您会很容易地了解上面的描述是怎么回事。

希望这能有所帮助。

票数 6
EN

Stack Overflow用户

发布于 2017-12-25 00:42:49

你可以试试这个

代码语言:javascript
运行
复制
OMP_PROC_BIND=true OMP_PLACES=cores OMP_NUM_THREADS=2 mpiexec -bind-to core:2 -n 2 ./xthi

MPI任务绑定在两个核心上,OpenMP运行时将(希望)将每个线程绑定到分配给MPI任务的单个核心。

为了检查MPI绑定是否正常,您可以简单地

代码语言:javascript
运行
复制
$ mpiexec -np 2 -bind-to core:2 grep Cpus_allowed_list /proc/self/status
Cpus_allowed_list:  0-1
Cpus_allowed_list:  2-3
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47821498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档