我知道,openMPI实现中有一些基本功能,用于将不同进程映射到不同套接字的不同内核(如果系统有多个套接字)。
--bind-to-socket
(先到先得)--bysocket
(循环,基于负载量)--npersocket N
(为每个套接字分配N个进程)--npersocket N --bysocket
(为每个套接字分配N进程,但以循环方式分配)--bind-to-core
(以顺序方式将一个进程绑定到每个核心)--bind-to-core --bysocket
(为每个核心分配一个进程,但不要使用任何套接字)--cpus-per-proc N
(将进程绑定到多个核心)--rankfile
(可以写出每个流程的首选项的完整描述)我在具有8个套接字(每个10个核心)的服务器上运行我的openMPI程序,并且由于多线程已启用,因此有160个核心可用。 我需要通过在套接字/内核和进程的不同组合上运行openMPI程序来进行分析。我希望在使用所有套接字并且代码处理某些数据传输的情况下最慢,因为内存传输速度最快该进程正在同一套接字的核心上执行。
So my questions are follows,
进程和套接字之间的最差/最佳案例映射是什么(每个进程都有睡眠持续时间和数据传输到根进程)?
有没有办法打印正在执行进程的套接字名称和核心详细信息? (如果流程真的在插座中分发,我会告诉我们)
答案 0 :(得分:9)
取决于很多因素,单个“银弹”答案不可能存在。这些因素包括计算强度(FLOPS /字节)以及本地数据量与过程之间传递的数据量之间的比率。它还取决于系统的体系结构。计算强度可以通过分析或使用PAPI,Likwid等分析工具进行测量。可以使用lstopo
实用程序检查系统的体系结构,hwloc
实用程序是Open MPI附带的lstopo
库的一部分。遗憾的是--report-bindings
无法告诉您每个内存通道的速度有多快以及NUMA节点之间的链接速度有多快。
是的,有:mpiexec --report-bindings --bind-to-core --bycore
使每个等级打印到其标准错误输出适用于它的关联掩码。不同的Open MPI版本的输出有所不同:
打开MPI 1.5.x 显示关联掩码的十六进制值:
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],0] to cpus 0001
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],1] to cpus 0002
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],2] to cpus 0004
[hostname:00599] [[10634,0],0] odls:default:fork binding child [[10634,1],3] to cpus 0008
0001
这表明排名0的关联掩码设置为0002
,这允许它仅在CPU 0上运行。 Rank 1的亲和力掩码设置为mpiexec --report-bindings --bind-to-socket --bysocket
,允许它仅在CPU 1上运行。等等。
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],0] to socket 0 cpus 003f
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],1] to socket 1 cpus 0fc0
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],2] to socket 0 cpus 003f
[hostname:21302] [[30955,0],0] odls:default:fork binding child [[30955,1],3] to socket 1 cpus 0fc0
003f
在这种情况下,亲和力掩模在0fc0
和003f
之间交替。二进制中的0000000000111111
为0fc0
,并且此类关联掩码允许每个偶数等级在0到5的CPU上执行。0000111111000000
为mpiexec --report-bindings --bind-to-core --bycore
,因此奇数等级仅在CPU 5到11。
打开MPI 1.6.x 使用更好的图形显示:
[hostname:39646] MCW rank 0 bound to socket 0[core 0]: [B . . . . .][. . . . . .]
[hostname:39646] MCW rank 1 bound to socket 0[core 1]: [. B . . . .][. . . . . .]
[hostname:39646] MCW rank 2 bound to socket 0[core 2]: [. . B . . .][. . . . . .]
[hostname:39646] MCW rank 3 bound to socket 0[core 3]: [. . . B . .][. . . . . .]
mpiexec --report-bindings --bind-to-socket --bysocket
[hostname:13888] MCW rank 0 bound to socket 0[core 0-5]: [B B B B B B][. . . . . .]
[hostname:13888] MCW rank 1 bound to socket 1[core 0-5]: [. . . . . .][B B B B B B]
[hostname:13888] MCW rank 2 bound to socket 0[core 0-5]: [B B B B B B][. . . . . .]
[hostname:13888] MCW rank 3 bound to socket 1[core 0-5]: [. . . . . .][B B B B B B]
B
每个套接字以图形方式表示为一组方括号,每个核心用一个点表示。每个等级所绑定的核心是由字母mpiexec --report-bindings --bind-to-core
表示。进程仅绑定到第一个硬件线程。
打开MPI 1.7.x 有点冗长,也知道硬件线程:
[hostname:28894] MCW rank 0 bound to socket 0[core 0[hwt 0-1]]: [BB/../../../../..][../../../../../..]
[hostname:28894] MCW rank 1 bound to socket 0[core 1[hwt 0-1]]: [../BB/../../../..][../../../../../..]
[hostname:28894] MCW rank 2 bound to socket 0[core 2[hwt 0-1]]: [../../BB/../../..][../../../../../..]
[hostname:28894] MCW rank 3 bound to socket 0[core 3[hwt 0-1]]: [../../../BB/../..][../../../../../..]
mpiexec --report-bindings --bind-to-socket
[hostname:29807] MCW rank 0 bound to socket 0[core 0[hwt 0-1]], socket 0[core 1[hwt 0-1]], socket 0[core 2[hwt 0-1]], socket 0[core 3[hwt 0-1]], socket 0[core 4[hwt 0-1]], socket 0[core 5[hwt 0-1]]: [BB/BB/BB/BB/BB/BB][../../../../../..]
[hostname:29807] MCW rank 1 bound to socket 1[core 6[hwt 0-1]], socket 1[core 7[hwt 0-1]], socket 1[core 8[hwt 0-1]], socket 1[core 9[hwt 0-1]], socket 1[core 10[hwt 0-1]], socket 1[core 11[hwt 0-1]]: [../../../../../..][BB/BB/BB/BB/BB/BB]
[hostname:29807] MCW rank 2 bound to socket 0[core 0[hwt 0-1]], socket 0[core 1[hwt 0-1]], socket 0[core 2[hwt 0-1]], socket 0[core 3[hwt 0-1]], socket 0[core 4[hwt 0-1]], socket 0[core 5[hwt 0-1]]: [BB/BB/BB/BB/BB/BB][../../../../../..]
[hostname:29807] MCW rank 3 bound to socket 1[core 6[hwt 0-1]], socket 1[core 7[hwt 0-1]], socket 1[core 8[hwt 0-1]], socket 1[core 9[hwt 0-1]], socket 1[core 10[hwt 0-1]], socket 1[core 11[hwt 0-1]]: [../../../../../..][BB/BB/BB/BB/BB/BB]
--bycore
Open MPI 1.7.x还将--bysocket
和--rank-by <policy>
选项替换为更通用的{{1}}选项。
答案 1 :(得分:2)
1。 如果每个节点和根之间存在相同的通信而没有其他通信模式,则通信不会影响特定进程 - &gt;套接字映射的性能。 (这假设套接字之间存在规则的对称互连拓扑。)否则,您通常会尝试在通信拓扑中放置彼此接近的通信过程对。在共享内存系统上使用MPI可能不相关,但在群集上肯定是。
但是,负载平衡也可能会影响映射的性能。如果某些进程等待消息/屏障,则该套接字上的其他核心可能能够使用更高的turbo频率。这在很大程度上取决于应用程序的运行时行为。仅包含睡眠和转移的应用程序并不真正有意义。
有许多性能分析工具可以帮助您回答问题。例如,OpenMPI附带VampirTrace,它生成包含有关MPI通信等信息的跟踪。您可以使用Vampir进行查看。