openMPI中的处理器/套接字关联?

Ank*_*tam 5 cpu processor core mpi openmpi

我知道,openMPI实现中有一些基本功能,用于将不同进程映射到不同套接字的不同内核(如果系统有多个套接字).

  1. --bind-to-socket(先到先得)
  2. --bysocket(循环,基于负载量)
  3. --npersocket N(为每个套接字分配N个进程)
  4. --npersocket N --bysocket(为每个套接字分配N进程,但以循环方式)
  5. --bind-to-core(以顺序方式将一个进程绑定到每个核心)
  6. --bind-to-core --bysocket(为每个核心分配一个进程,但绝不会减少使用的任何套接字)
  7. --cpus-per-proc N(将进程绑定到多个核心)
  8. --rankfile(可以写出每个过程的偏好的完整描述)

我在具有8个套接字(每个10个核心)的服务器上运行我的openMPI程序,并且由于多线程处于打开状态,因此有160个核心可用.我需要通过在不同的套接字/内核和进程组合上运行openMPI程序来进行分析.我希望在使用所有套接字并且代码处理一些数据传输的情况下最慢,因为内存传输最快该进程正在同一个套接字的核心上执行.

So my questions are follows,
Run Code Online (Sandbox Code Playgroud)
  1. 进程和套接字之间的最差/最佳情况映射是什么(每个进程都有睡眠持续时间和数据传输到根进程)?

  2. 有没有办法打印正在执行进程的套接字名称和核心详细信息?(如果进程真的在套接字中分配,我将告诉我们它)

Hri*_*iev 9

  1. 这取决于很多因素,单个"银弹"答案不可能存在.这些因素包括计算强度(FLOPS /字节)以及本地数据量与过程之间传递的数据量之间的比率.它还取决于系统的体系结构.计算强度可以通过分析或使用PAPI,Likwid等分析工具进行测量.系统的体系结构可以使用lstopo实用程序进行检查,该实用程序hwloc是Open MPI附带的库的一部分.遗憾的是lstopo,无法告诉您每个内存通道的速度有多快以及NUMA节点之间的链接有多快/多.

  2. 是的,有:--report-bindings使每个等级打印到其标准错误输出适用于它的亲和力掩码.不同的Open MPI版本的输出有所不同:

Open MPI 1.5.x显示了关联掩码的十六进制值:

mpiexec --report-bindings --bind-to-core --bycore

[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
Run Code Online (Sandbox Code Playgroud)

这表明秩0的关联掩码设置为0001允许它仅在CPU 0上运行.等级1的亲和力掩码设置0002允许它仅在CPU 1上运行.等等.

mpiexec --report-bindings --bind-to-socket --bysocket

[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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,亲和掩模在003f和之间交替0fc0.003f在二进制是0000000000111111和这样的亲和掩码允许每个偶数等级到CPU上执行从0到5 0fc00000111111000000,因此奇数行列仅调度上的CPU 5至11.

Open MPI 1.6.x使用更好的图形显示:

mpiexec --report-bindings --bind-to-core --bycore

[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 . .][. . . . . .]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

每个套接字以图形方式表示为一组方括号,每个核心用点表示.每个等级所绑定的核心用字母表示B.进程仅绑定到第一个硬件线程.

Open MPI 1.7.x有点冗长,也知道硬件线程:

mpiexec --report-bindings --bind-to-core

[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/../..][../../../../../..]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

Open MPI 1.7.x还使用更通用的选项替换--bycore和选项.--bysocket--rank-by <policy>