如何分配每个核心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:
如何分配每个核心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:
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 id
和core id
,但不同processor
和apicid
。 物理ID等于的值processor
。
我不知道,如果你有多个计算机或没有,你想怎么处理分布式的,但我会考虑读了具体细节:
的mpirun手册页
手动指示它具有结合过程以不同的东西,包括节点,插座,以及CPU内核的方式。
需要注意的是,你会做到这一点,如果你只需要运行两倍多的进程,你的CPU内核,因为它们往往会均匀地分布在核心共享负载是很重要的。
我想尝试像下面这样,虽然手册是有点含糊,我不是100%肯定它会表现为预期的,只要你有一个双核:
mpirun -np 4 -npersocket 4 ./application
如果您使用的PBS,或类似的东西,我会建议这类提交:
的qsub -l选择= 128:n个CPU = 40:mpiprocs = 16 -v NPROC = 2048 / pbs_script.csh
在本提交我选择128个计算节点中,具有40芯,用它们的16。 就我而言,我每个节点有20个物理内核。
在此提交我阻止所有节点的40个核,没有人可以使用这些资源。 这样可避免使用相同的节点,并与你的工作竞争的其他民族。
使用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
选项(没有超额订购)。