我想准确地将我的 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 0001和0002?--bind-to-socket导致更多的混乱: 2x 000f?
我使用最后一段来总结我的实验中提出的问题:
- 为什么我的--cpu-set命令不起作用?
- 我应该如何解释--report-bindings输出产生的输出?
亲切的问候