cod*_*ons 5 affinity hyperthreading openmpi
如何为每个核心分配2个MPI进程?
例如,如果我这样做,mpirun -np 4 ./application它应该使用2个物理核心来运行4个MPI进程(每个核心2个进程).我正在使用Open MPI 1.6.我做了mpirun -np 4 -nc 2 ./application但是无法运行它.
它抱怨 mpirun was unable to launch the specified application as it could not find an executable:
orterun(Open MPI SPMD/MPMD启动程序; mpirun/mpiexec它只是符号链接)对流程绑定有一些支持,但它不够灵活,不允许你为每个核心绑定两个进程.您可以尝试使用-bycore -bind-to-core但是当所有核心已经分配了一个进程时它会出错.
但是有一种解决方法 - 您可以使用rankfile来明确指定将每个排名绑定到哪个槽.下面是一个示例:为了在双核CPU上运行4个进程,每个核2个进程,您将执行以下操作:
mpiexec -np 4 -H localhost -rf rankfile ./application
Run Code Online (Sandbox Code Playgroud)
其中rankfile是包含以下内容的文本文件:
rank 0=localhost slot=0:0
rank 1=localhost slot=0:0
rank 2=localhost slot=0:1
rank 3=localhost slot=0:1
Run Code Online (Sandbox Code Playgroud)
这将在处理器0的核0上排名0和1,在处理器0的核1上排名2和3.丑陋但有效:
$ mpiexec -np 4 -H localhost -rf rankfile -tag-output cat /proc/self/status | grep Cpus_allowed_list
[1,0]<stdout>:Cpus_allowed_list: 0
[1,1]<stdout>:Cpus_allowed_list: 0
[1,2]<stdout>:Cpus_allowed_list: 1
[1,3]<stdout>:Cpus_allowed_list: 1
Run Code Online (Sandbox Code Playgroud)
编辑:从您的其他问题变得清楚,您实际上是在超线程CPU上运行.然后你必须弄清楚你的逻辑处理器的物理编号(它有点令人困惑,但物理编号对应于processor:报告的值/proc/cpuinfo).获得它的最简单方法是安装hwloc库.它提供了hwloc-ls您可以使用的工具,如下所示:
$ hwloc-ls --of console
...
NUMANode L#0 (P#0 48GB) + Socket L#0 + L3 L#0 (12MB)
L2 L#0 (256KB) + L1 L#0 (32KB) + Core L#0
PU L#0 (P#0) <-- Physical ID 0
PU L#1 (P#12) <-- Physical ID 12
...
Run Code Online (Sandbox Code Playgroud)
物理ID列P#在括号中.在你的8核的情况下,第一个核心(核心0)的第二个超线程很可能有ID 8,因此你的rankfile看起来像:
rank 0=localhost slot=p0
rank 1=localhost slot=p8
rank 2=localhost slot=p1
rank 3=localhost slot=p9
Run Code Online (Sandbox Code Playgroud)
(注意p前缀 - 不要省略它)
如果您没有hwloc或无法安装它,那么您必须自己解析/proc/cpuinfo.超线程将有相同的价值观physical id和core id而不同processor和apicid.物理ID等于的值processor.
| 归档时间: |
|
| 查看次数: |
10981 次 |
| 最近记录: |