为什么我的插槽间MPI发送带宽大于内存带宽?

时间:2017-12-12 17:25:11

标签: mpi bandwidth memory-bandwidth

我在NERSC的Cori的Haswell节点上进行了osu_mbw_mr测试(来自OSU微基准测试)并得到了一些我无法解释的奇怪结果。

该节点有两个插槽,每个插槽都有一个16核Intel Xeon处理器E5-2698 v3。两个处理器通过QPI连接。可以找到节点和CPU的详细信息herehere

如果我是正确的,节点的最大内存带宽是68GB / s x 2 CPUs = 136GB / s,QPI的最大带宽是 9.6 GT / s x 2链接x 2字节/链接= 38.4 GB / s,双向。我还用STREAM测量了内存带宽。复制带宽约为110GB / s,接近理论值。那很好。

我在一个节点上运行了osu_mbw_mr,其中有32个MPI等级,并将前16个等级放在套接字0上,接下来的16个等级放在套接字1上。

在osu_mbw_mr中,每个等级分配一个发送缓冲区(s_buf)和一个接收缓冲区(r_buf),然后初始化它们(因此我假设缓冲区通过第一次触摸与它们的NUMA域具有亲和性)。对于32个等级,等级0~15将固定数量的消息(窗口大小)背对背地发送到成对的接收等级,即16~31。我用过Cray MPICH。我认为无论MPI如何实现,净效果都是“将数据从s_buf(跨越QPI链接)复制到r_buf”。

以下是我的测试结果。我不明白为什么8K,16K等消息大小的带宽如此之大,并且突然下降到2MB消息。带宽大于QPI带宽,甚至比DRAM带宽还要大。在我的理论中,带宽应该受到QPI带宽的一半(19.2GB / s)的约束,因为我们将数据从套接字0单向发送到1。

有什么问题?感谢。

# OSU MPI Multiple Bandwidth / Message Rate Test v5.4.0
# [ pairs: 16 ] [ window size: 64 ]
# Size                  MB/s        Messages/s
1                      47.55       47550478.99
2                      94.74       47371180.52
4                     192.20       48048858.02
8                     389.46       48683010.22
16                    767.81       47988126.30
32                   1527.34       47729482.30
64                   2139.12       33423707.44
128                  4010.11       31328973.47
256                  7749.86       30272897.24
512                 13507.57       26381964.28
1024                15918.48       15545388.20
2048                19846.84        9690838.02
4096                21718.65        5302404.21
8192               146607.66       17896442.75
16384              183905.06       11224674.34
32768              240191.47        7330061.88
65536              280938.91        4286787.57
131072             238150.74        1816945.97
262144             156911.43         598569.60
524288             156919.72         299300.61
1048576            143541.91         136892.24
2097152             28835.20          13749.69
4194304             26170.38           6239.50

正如一条评论提醒我的那样,OSU微基准测试在发送中反复使用相同的发送缓冲区。所以数据基本上都在缓存中。这次我使用了英特尔MPI基准测试,它可以选择发送高速缓存数据。我用

在同一台机器上运行它
  

srun -n 32 -c 2 -m block:block --cpu_bind = cores,verbose ./IMB-MPI1   Uniband -off_cache 40,64

得到这些数字,正如预期的那样低于内存带宽。

#---------------------------------------------------
# Benchmarking Uniband
# #processes = 32
#---------------------------------------------------
       #bytes #repetitions   Mbytes/sec      Msg/sec
            0         1000         0.00     56794458
            1         1000        49.89     49892748
            2         1000        99.96     49980418
            4         1000       199.34     49834857
            8         1000       399.30     49912461
           16         1000       803.53     50220613
           32         1000      1598.35     49948450
           64         1000      2212.19     34565472
          128         1000      4135.43     32308048
          256         1000      7715.76     30139698
          512         1000     12773.43     24948113
         1024         1000     16440.25     16054932
         2048         1000     19674.01      9606451
         4096         1000     21574.97      5267326
         8192         1000     92699.99     11315916
        16384         1000     90449.54      5520602
        32768         1000     27340.68       834371
        65536          640     25626.04       391022
       131072          320     25848.76       197210
       262144          160     25939.50        98951
       524288           80     25939.48        49476
      1048576           40     25909.70        24709
      2097152           20     25915.54        12357
      4194304           10     25949.97         6187

0 个答案:

没有答案