我想要准确地将我的MPI进程绑定到(物理)核心的列表中。我指的是mpirun的以下几点--帮助输出:
-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 --报告绑定。/求解器程序正常启动,但不考虑我提供的--cpu-set参数。另一方面,用mpirun -np 2启动程序
[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实际上使用指定的核心。但是我应该如何解释这个输出呢?除了主机(尼泊尔图)和指定的插槽(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,时,top命令再次向我显示使用了核心0和1,但是为什么输出cpus 0001和0002?--bind-to-socket会造成更多的混乱: 2x 000f
我用最后一段来总结我的实验中提出的问题:
引用CPU-拓扑是用LIKWID性能工具读出的,更准确地说是使用likwid-topology.LIKWID是在GPL-3.0许可下授权的,请参阅他们的GitHub以获得更多信息。
发布于 2013-06-05 22:21:55
在这两种情况下,输出都与您让Open执行的操作完全匹配。cpus ...中的十六进制数显示了进程允许的CPU(亲和掩码)。这是一个位字段,每个位代表一个逻辑CPU。
使用--bind-to-core,每个MPI进程都绑定到自己的CPU核心。秩0 ([...,0])的关联掩码设置为0001,这意味着逻辑CPU 0。等级1 ([...,1])的关联掩码设置为0002,这意味着逻辑CPU 1。逻辑CPU编号可能与输出中的HWThread标识符与拓扑信息相匹配。
使用--bind-to-socket,每个MPI进程都绑定到套接字的所有核心。在您的特殊情况下,关联掩码设置为000f,或二进制的0000000000001111,它对应于套接字中的所有四个核心。每个核心只分配一个超级线程。
您可以进一步指导Open如何选择多个套接字节点上的套接字。在--bysocket中,套接字是以循环方式选择的,即第一级放置在第一个套接字上,下一个等级放在下一个套接字上,等等,直到每个套接字有一个进程,然后下一个顺序又放在第一个套接字上,依此类推。对于--bycore,每个套接字接收的连续级别与该套接字中的核数一样多。
我建议您阅读OpenMPI1.4.x的mpirun手册,特别是过程绑定部分。有一些例子说明了不同的绑定选项是如何相互作用的。手册中没有提到--cpu-set选项,尽管Jeff在开放MPI中的处理器关联特性上写了一个很好的页面(大约是1.5,但大多数(如果不是全部)也适用于v1.4 )。
https://stackoverflow.com/questions/16950063
复制相似问题