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

时间:2013-07-11 22:52:50

标签: mpi cpu core processor 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(可以写出每个流程的首选项的完整描述)
  9. 我在具有8个套接字(每个10个核心)的服务器上运行我的openMPI程序,并且由于多线程已启用,因此有160个核心可用。 我需要通过在套接字/内核和进程的不同组合上运行openMPI程序来进行分析。我希望在使用所有套接字并且代码处理某些数据传输的情况下最慢,因为内存传输速度最快该进程正在同一套接字的核心上执行。

    So my questions are follows,
    

    1. 进程和套接字之间的最差/最佳案例映射是什么(每个进程都有睡眠持续时间和数据传输到根进程)?

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

2 个答案:

答案 0 :(得分:9)

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

  2. 是的,有:mpiexec --report-bindings --bind-to-core --bycore使每个等级打印到其标准错误输出适用于它的关联掩码。不同的Open MPI版本的输出有所不同:

  3. 打开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

    在这种情况下,亲和力掩模在0fc0003f之间交替。二进制中的00000000001111110fc0,并且此类关联掩码允许每个偶数等级在0到5的CPU上执行。0000111111000000mpiexec --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频率。这在很大程度上取决于应用程序的运行时行为。仅包含睡眠和转移的应用程序并不真正有意义。

  1. 您可以使用libnuma / sched_getaffinity手动确认您的流程固定。
  2. 有许多性能分析工具可以帮助您回答问题。例如,OpenMPI附带VampirTrace,它生成包含有关MPI通信等信息的跟踪。您可以使用Vampir进行查看。