openmpi mpirun v1.8中--map-by选项的语法

时间:2015-01-29 14:17:13

标签: mpi openmpi

查看openmpi manual

中的以下摘录
--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.

我对语法有不同的疑问,并对它们有一些评论:

  • sequentialdistanceppr选项涉及哪些内容?

特别是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) 

1 个答案:

答案 0 :(得分:16)

ppr表示每个资源的进程。它的语法是ppr:N:resource,它意味着“将 N 进程分配给主机上可用的 resource 类型的每个资源”。例如,在具有--map-by ppr:4:socket的6核CPU的4插槽系统上,会产生以下流程图:

 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

(在此示例中,流程编号从A运行到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 。这应该读作“每个套接字启动两个进程并将它们中的每一个绑定到两个处理元素”,并且应该在给定相同的四插槽系统的情况下得到以下映射:

sequential

dist映射器逐行读取主​​机文件,并在每个主机上启动一个进程。如果给出,它会忽略插槽计数。

Socket 0 ------------- Socket 1 | | | | | | | | | | Socket 2 ------------- Socket 3 | ib0 映射器将NUMA节点上的进程映射到后者与给定PCI资源的距离。它只适用于NUMA系统。再次,让我们使用玩具四插槽系统,但这次扩展了表示,以显示NUMA拓扑:

ib0

套接字之间的线表示CPU链接。那些是,例如用于AMD CPU的Intel CPU和HT链接的QPI链接。 ib0是用于与其他计算节点通信的InfiniBand HCA。现在,在该系统中,Socket 2直接与InfiniBand HCA对话。套接字0和套接字3必须跨越一个CPU链接才能与--map-by dist:ib0通信,而套接字1必须跨越2个CPU链接。这意味着,在Socket 2上运行的进程将具有尽可能低的延迟,而在Socket 1上发送和接收消息和进程将具有最高可能的延迟。

它是如何工作的?如果您的主机文件指定例如该主机上有16个插槽,映射选项为 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 ,可能会生成以下映射:

--map-by dist:ib0:span

6个进程映射到最接近InfiniBand HCA的Socket 2,然后另外6个进程映射到第二个最接近的Socket 0,另外4个进程映射到Socket 3.也可以扩展进程而不是线性填充处理元件。 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 导致:

hwloc

使用hwloc库获取实际的NUMA拓扑,该库读取BIOS提供的距离信息。 hwloc-ls包含一个名为lstopo的命令行工具(也称为-v),可用于显示系统的拓扑。通常它只包括处理元素的拓扑和输出中的NUMA域,但是如果你给它{{1}}选项它还包括PCI设备。