openmpi - 每个核心分配两个 MPI 进程

标签 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:

最佳答案

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

但是有一种解决方法 - 您可以使用 rankfile 来明确指定将每个 rank 绑定(bind)到哪个插槽。下面是一个示例:为了在双核 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

编辑:来自您的 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因此您的排名文件看起来像:
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 的值.

关于openmpi - 每个核心分配两个 MPI 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11749182/

相关文章:

c - MPI:使用 MPI_Isend 发送消息并使用 C 中的 MPI_Irecv 接收消息

linux - 为什么使用 taskset 在一组孤立的内核上运行多线程 Linux 程序会导致所有线程都在一个内核上运行?

windows - 为分析设置 CPU 亲和性

multithreading - 超线程处理器内核可以完全同时执行两个线程吗?

Python多处理池: Why doesn't adding additional processes seem to improve performance on a hyperthreaded system?

multithreading - 强制MPI使用指定的编号。核心

c - 与 MPI 相关的 'cluster' 软件的作用是什么?

c++ - Mac 上的超线程——没有提供太多加速

c++ - MPI_Barrier() 的行为?