为每个核心分配两个MPI进程

时间:2012-07-31 21:20:33

标签: openmpi affinity hyperthreading

如何为每个核心分配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:

5 个答案:

答案 0 :(得分:9)

orterun(Open MPI SPMD / MPMD启动器; mpirun/mpiexec只是它的符号链接)对流程绑定有一些支持,但它不够灵活,不允许你为每个核心绑定两个进程。您可以尝试使用-bycore -bind-to-core,但是当所有核心都已经为其分配了一个进程时,它会出错。

但是有一种解决方法 - 您可以使用 rankfile ,其中您明确指定将每个排名绑定到哪个插槽。下面是一个示例:为了在双核CPU上运行4个进程,每个核2个进程,您将执行以下操作:

mpiexec -np 4 -H localhost -rf rankfile ./application

其中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

这将在处理器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

编辑:从您的other question可以清楚地知道您实际上是在超线程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
...

物理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

(注意p前缀 - 不要省略它)

如果您没有hwloc或者无法安装,那么您必须自己解析/proc/cpuinfo。超线程具有相同的physical idcore id值,但processorapicid不同。物理ID等于processor的值。

答案 1 :(得分:2)

我不确定您是否有多台机器,以及您希望如何分发这些流程的具体细节,但我会考虑阅读:

mpirun man page

该手册表明它具有将进程绑定到不同内容的方法,包括节点,套接字和cpu内核。

重要的是要注意,如果您只运行两倍于CPU核心的进程,那么您将实现此目标,因为它们将倾向于均匀分布在核心上以共享负载。

我会尝试类似下面的内容,虽然手册有些含糊不清,但我不能100%确定它会按预期运行,只要你有双核心:

mpirun -np 4 -npersocket 4 ./application

答案 2 :(得分:1)

如果您使用PBS或类似的东西,我会建议这种提交:

qsub -l select = 128:ncpus = 40:mpiprocs = 16 -v NPROC = 2048. / pbs_script.csh

在本提交中,我选择了128个计算节点,它们有40个核心,并使用其中的16个。就我而言,每个节点有20个物理核心。

在此提交中,我阻止了节点的所有40个核心,没有人可以使用这些资源。它可以避免其他人使用相同的节点并与你的工作竞争。

答案 3 :(得分:0)

使用Open MPI 4.0,这两个命令:

mpirun --oversubscribe -c 8 ./a.out

mpirun -map-by hwthread:OVERSUBSCRIBE -c 8 ./a.out

为我工作(我有一个Ryzen 5处理器,具有4个内核和8个逻辑内核)。

我用一个包含实数运算的do循环进行了测试。使用了所有逻辑线程,尽管似乎没有加速的好处,因为与使用-c 4选项(没有超额预订)相比,计算花费了两倍的时间。

答案 4 :(得分:0)

你可以运行 mpirun --use-hwthread-cpus ./application

在这种情况下,Open MPI 会认为处理器是超线程提供的线程。这与将处理器视为 CPU 内核时的默认行为形成对比。

Open MPI 表示使用此选项时由超线程提供的线程为“硬件线程”,并为每个“硬件线程”分配一个 Open MPI 处理器。