5

我想准确地将我的 MPI 进程固定到(物理)核心列表中。我参考了 mpirun --help 输出的以下几点:

   -cpu-set|--cpu-set <arg0>  
                         Comma-separated list of ranges specifying logical
                         cpus allocated to this job [default: none]

...

   -rf|--rankfile <arg0>  
                         Provide a rankfile file

我的处理器的拓扑如下:

-------------------------------------------------------------
CPU type:       Intel Core Bloomfield processor 
*************************************************************
Hardware Thread Topology
*************************************************************
Sockets:        1 
Cores per socket:       4 
Threads per core:       2 
-------------------------------------------------------------
HWThread        Thread          Core            Socket
0               0               0               0
1               0               1               0
2               0               2               0
3               0               3               0
4               1               0               0
5               1               1               0
6               1               2               0
7               1               3               0
-------------------------------------------------------------
Socket 0: ( 0 4 1 5 2 6 3 7 )
-------------------------------------------------------------

现在,如果我使用mpirun -np 2 --cpu-set 0,1 --report-bindings ./solver启动我的程序,程序会正常启动,但不考虑我提供的--cpu-set参数。另一方面,使用mpirun -np 2 --rankfile rankfile --report-bindings ./solver启动我的程序会给我以下输出:

[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],0] to slot_list 0
[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],1] to slot_list 1

确实检查top向我展示了 mpirun 实际上使用了指定的内核。但是我应该如何解释这个输出呢?除了主机 ( neptun ) 和指定的插槽 ( 0,1 ) 我没有任何线索。与我尝试过的其他命令相同:

$mpirun --np 2 --bind-to-core --report-bindings ./solver
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],0] to cpus 0001
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],1] to cpus 0002

$mpirun --np 2 --bind-to-socket --report-bindings ./solver
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],0] to socket 0 cpus 000f
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],1] to socket 0 cpus 000f

使用--bind-to-core顶部命令再次向我显示使用了核心 0 和 1,但为什么输出cpus 00010002--bind-to-socket导致更多的混乱: 2x 000f

我使用最后一段来总结我的实验中提出的问题:
- 为什么我的--cpu-set命令不起作用?
- 我应该如何解释--report-bindings输出产生的输出?

亲切的问候

4

1 回答 1

5

在这两种情况下,输出都与您告诉 Open MPI 所做的完全匹配。中的十六进制数字cpus ...显示进程允许的 CPU(关联掩码)。这是一个位字段,每个位代表一个逻辑 CPU。

每个 MPI 进程都绑定到--bind-to-core自己的 CPU 内核。等级 0 ( [...,0]) 的关联掩码设置为0001逻辑 CPU 0。等级 1 ( [...,1]) 的关联掩码设置为0002逻辑 CPU 1。逻辑 CPU 编号可能HWThread将输出中的标识符与拓扑信息匹配。

每个 MPI 进程都绑定到--bind-to-socket套接字的所有核心。在您的特定情况下,关联掩码设置为000f0000000000001111二进制,它对应于套接字中的所有四个核心。每个内核只分配一个超线程。

您可以进一步指示 Open MPI 如何选择多套接字节点上的套接字。以--bysocket循环方式选择套接字,即第一个 rank 放置在第一个套接字上,下一个 rank 放置在下一个套接字上,依此类推,直到每个套接字有一个进程,然后再次放置下一个 rank在第一个插座上,依此类推。每个插槽接收与--bycore该插槽中的核心数量一样多的连续排名。

我建议您阅读mpirunOpen MPI 1.4.x 的手册,尤其是Process Binding部分。那里有一些示例说明不同的绑定选项如何相互交互。手册中没有提到该--cpu-set选项,尽管 Jeff Squyres 写了一篇关于Open MPI 中处理器关联特性的不错的页面(它大约是 v1.5,但如果不是全部的话,大部分也适用于 v1.4)。

于 2013-06-05T22:21:55.417 回答