我在 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