分配每核双MPI进程分配每核双MPI进程(assign two MPI processes per

2019-05-12 03:47发布

如何分配每个核心2个MPI进程?

例如,如果我mpirun -np 4 ./application那么它应该使用2个物理内核运行4个MPI进程(每个芯2个进程)。 我使用开放MPI 1.6。 我mpirun -np 4 -nc 2 ./application但无法运行。

它抱怨mpirun was unable to launch the specified application as it could not find an executable:

Answer 1:

orterun (开放MPI SPMD / MPMD发射器; mpirun/mpiexec都只是符号连接的话)对工艺结合了一些支持,但它不够灵活,让您绑定每个核心两个过程。 您可以尝试-bycore -bind-to-core ,但它会犯错,当所有内核已经有一个过程分配给他们。

但是有一个解决方法-您可以使用一个rankfile,你明确指定各等级绑定到哪个插槽。 这里有一个例子:以每个核心2个处理的双核CPU上运行4个过程,你会做以下几点:

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并在芯1位列2和3处理器的0丑陋但工作原理:

$ 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



Answer 2:

我不知道,如果你有多个计算机或没有,你想怎么处理分布式的,但我会考虑读了具体细节:

的mpirun手册页

手动指示它具有结合过程以不同的东西,包括节点,插座,以及CPU内核的方式。

需要注意的是,你会做到这一点,如果你只需要运行两倍多的进程,你的CPU内核,因为它们往往会均匀地分布在核心共享负载是很重要的。

我想尝试像下面这样,虽然手册是有点含糊,我不是100%肯定它会表现为预期的,只要你有一个双核:

mpirun -np 4 -npersocket 4 ./application


Answer 3:

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

的qsub -l选择= 128:n个CPU = 40:mpiprocs = 16 -v NPROC = 2048 / pbs_script.csh

在本提交我选择128个计算节点中,具有40芯,用它们的16。 就我而言,我每个节点有20个物理内核。

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



Answer 4:

使用Open MPI 4.0,两个命令:

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

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

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

我有一个做循环,包括上实数运算测试。 所有逻辑线程的使用,但它似乎没有加速好处,因为计算需要相比,采用双层的时间量-c 4选项(没有超额订购)。



文章来源: assign two MPI processes per core