6

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

4

5 回答 5

11

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

但是有一种解决方法 - 您可以使用rankfile来明确指定将每个 rank 绑定到哪个插槽。下面是一个示例:为了在双核 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 和 1 放在处理器 0 的核心 0 上,并将等级 2 和 3 放在处理器 0 的核心 1 上。丑陋但有效:

$ 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

编辑:从您的另一个问题可以清楚地看出您实际上是在超线程 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

于 2012-08-01T14:56:01.203 回答
3

我不确定您是否有多台机器,以及您希望如何分配进程的确切细节,但我会考虑阅读:

mpirun 手册页

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

重要的是要注意,如果您运行的进程数量是 CPU 内核的两倍,那么您将实现这一点,因为它们往往会均匀地分布在内核上以共享负载。

我会尝试以下类似的方法,尽管该手册有些模棱两可,而且我不能 100% 确定它会按预期运行,只要您有双核:

mpirun -np 4 -npersocket 4 ./application
于 2012-07-31T21:50:29.250 回答
2

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

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

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

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

于 2015-06-01T14:31:43.457 回答
2

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

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

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

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

我使用包含实数运算的 do 循环进行了测试。使用了所有逻辑线程,但似乎没有加速优势,因为与使用-c 4选项(没有超额订阅)相比,计算需要双倍的时间。

于 2019-03-07T11:06:25.007 回答
1

你可以跑 mpirun --use-hwthread-cpus ./application

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

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

于 2021-05-28T02:04:11.847 回答