查看openmpi手册中的以下摘录
--map-by <foo>
Map to the specified object, defaults to socket. Supported options
include slot, hwthread, core, L1cache, L2cache, L3cache, socket,
numa, board, node, sequential, distance, and ppr. Any object can
include modifiers by adding a : and any combination of PE=n (bind n
processing elements to each proc), SPAN (load balance the processes
across the allocation), OVERSUBSCRIBE (allow more processes on a node
than processing elements), and NOOVERSUBSCRIBE. This includes PPR,
where the pattern would be terminated by another colon to separate
it from the modifiers.
Run Code Online (Sandbox Code Playgroud)
我对语法有一些不同的问题,并对它们有一些评论:
sequential,distance并ppr参考?特别ppr困惑我.什么是缩写?
--map-by ppr:4:socket关于手册摘录的选项?当然,通过查看报告的绑定,我可以看到前一个选项的结果--report-bindings(只有4个进程映射到一个套接字,默认绑定到一个套接字的4个核心),但我无法理解语法.在本手册的另一行中,它说这个新选项取代了以下不赞成使用--npersocket:
-npersocket, --npersocket <#persocket>
On each node, launch this many processes times the number of processor
sockets on the node. The -npersocket option also turns on the -bind-
to-socket option. (deprecated in favor of --map-by ppr:n:socket)
Run Code Online (Sandbox Code Playgroud)
Hri*_*iev 18
ppr表示每个资源的进程.其语法是ppr:N:resource和它的意思是"分配Ñ进程类型的每个资源的资源主机上可用".例如,在具有6核CPU的4插槽系统上,--map-by ppr:4:socket产生以下流程图:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process A B C D E F G H I J K L M N O P
Run Code Online (Sandbox Code Playgroud)
(进程编号从本示例中的Ato 运行Z)
手册的含义是整体ppr:N:resource被视为一个单一的说明者,并且可以在它之后添加选项:,例如,由...分隔ppr:2:socket:pe=2.这应该读作"每个套接字启动两个进程并将它们中的每一个绑定到两个处理元素",并且应该在给定相同的四插槽系统的情况下得到以下映射:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process A A B B C C D D E E F F G G H H
Run Code Online (Sandbox Code Playgroud)
该sequential映射器通过读取线主机文件线开始每个主机一个过程中发现存在.如果给出,它会忽略插槽计数.
所述dist映射器通过后者从给定PCI资源的距离映射上NUMA节点的过程.它只适用于NUMA系统.再次,让我们使用玩具四插槽系统,但这次扩展表示,以显示NUMA拓扑:
Socket 0 ------------- Socket 1
| |
| |
| |
| |
| |
Socket 2 ------------- Socket 3
|
ib0
Run Code Online (Sandbox Code Playgroud)
套接字之间的线表示CPU链接.这些是,例如Intel CPU的QPI链接和AMD CPU的HT链接.ib0是用于与其他计算节点通信的InfiniBand HCA.现在,在该系统中,Socket 2直接与InfiniBand HCA对话.套接字0和套接字3必须跨越一个CPU链路才能与之通信,ib0而套接字1必须跨越2个CPU链路.这意味着,在Socket 2上运行的进程将具有尽可能低的延迟,而在Socket 1上发送和接收消息和进程将具有尽可能高的延迟.
它是如何工作的?如果您的主机文件指定该主机上有16个插槽且映射选项为--map-by dist:ib0,则可能会生成以下映射:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process G H I J K L A B C D E F M N O P
Run Code Online (Sandbox Code Playgroud)
6个进程映射到最接近InfiniBand HCA的Socket 2,然后另外6个进程映射到第二个最接近的Socket 0,另外4个映射到Socket 3.还可以扩展进程而不是线性填充处理要素.--map-by dist:ib0:span结果是:
socket ---- 0 ---- ---- 1 ---- ---- 2 ---- ---- 3 ----
core 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5
process E F G H M N O P A B C D I J K L
Run Code Online (Sandbox Code Playgroud)
使用hwloc库获取实际的NUMA拓扑,该库读取BIOS提供的距离信息.hwloc包括一个名为hwloc-ls(也称为lstopo)的命令行工具,可用于显示系统的拓扑.通常它只包括处理元素的拓扑结构和输出中的NUMA域,但如果你给它-v选项,它还包括PCI设备.