0

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

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

如果我是正确的,节点的最大内存带宽是 68GB/sx 2 CPUs = 136GB/s,QPI 的最大带宽是 9.6 GT/sx 2 Links x 2 Bytes/link = 38.4 GB/s,双向。我还用 STREAM 测量了内存带宽。拷贝带宽约为110GB/s,接近理论值。这太棒了。

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

在 osu_mbw_mr 中,每个 rank 分配一个发送缓冲区(s_buf)和一个接收缓冲区(r_buf),然后初始化它们(因此我假设缓冲区通过第一次接触与它们的 NUMA 域具有亲和力)。在 32 个等级中,等级 0~15 背靠背发送固定数量的消息(窗口大小)到配对的接收等级,即 16~31。我使用了克雷 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 微基准在发送中重复使用相同的发送缓冲区。所以数据基本上在缓存中。这次我使用了 Intel MPI Benchmarks,它可以选择发送缓存外数据。我在同一台机器上运行它

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
4

0 回答 0