首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >openmpi mpirun v1.8中--map-by选项的语法

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

Stack Overflow用户
提问于 2015-01-29 14:17:12
回答 1查看 13.6K关注 0票数 16

查看开放manual手册的以下摘录

代码语言:javascript
运行
复制
--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

代码语言:javascript
运行
复制
-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) 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-30 06:47:59

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

代码语言:javascript
运行
复制
 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。这应该读为“每个套接字启动两个进程,并将每个进程绑定到两个处理元素”,并在相同的四套接字系统中得到以下映射:

代码语言:javascript
运行
复制
 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映射器通过NUMA节点与给定的PCI资源之间的距离映射NUMA节点上的进程。它只对NUMA系统有意义。同样,让我们使用玩具四套接字系统,但这一次扩展了表示,以显示NUMA拓扑:

代码语言:javascript
运行
复制
 Socket 0 ------------- Socket 1
    |                      |
    |                      |
    |                      |
    |                      |
    |                      |
 Socket 2 ------------- Socket 3
    |
   ib0

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

它怎麽工作?如果主机文件指定了该主机上的16个插槽,并且映射选项为--map-by dist:ib0,则可能会产生以下映射:

代码语言:javascript
运行
复制
 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

将6个进程映射到距InfiniBand HCA最近的套接字2,然后将6个进程映射到第二最接近的套接字0,再映射4个进程到套接字3。还可以扩展进程,而不是线性填充处理元素。--map-by dist:ib0:span的结果是:

代码语言:javascript
运行
复制
 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

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

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28216897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档