这是 GPU 微基准测试的集合。每个测试旨在测试特定场景或硬件机制。一些基准已用于为这些论文生成数据:
“现代 GPU 上代码生成过程中的分析性能评估”
“GPU 上真实复杂的高瘦矩阵乘法内核的性能工程”
称为gpu-<benchmarkname>
的基准测试是可以 hipify 的!默认 Makefile 目标构建 CUDA 可执行文件cuda-<benchmarkname>
,而目标make hip-<benchmarkname>
使用 hipify-perl 工具从main.cu
文件创建文件main.hip
,并使用 hip 编译器构建它。编写 CUDA 主文件后,hipify 工具无需进一步干预即可工作。
另请查看 gpu-metrics 函数,它提供了一种简洁的方法来测量正在运行的程序内启动的内核的硬件性能计数器指标。
如果本文有用,欢迎加星和引用!
测量不同占用情况下流媒体内核的带宽。共享内存分配充当扰流器,因此每个 SM 只能运行两个线程块。扫描线程块大小从32到1024,扫描占用率从3%到100%。
核心 | 公式 | |
---|---|---|
初始化 | A[i] = c | 1 个存储流 |
读 | 总和 = A[i] | 1 个负载流 |
规模 | A[i] = B[i] * c | 1 个加载流,1 个存储流 |
三合会 | A[i] = B[i] + c * C[i] | 2 个加载流,1 个存储流 |
3分 | A[i] = B[i-1] + B[i] + B[i+1] | 1 个加载流,1 个存储流 |
5分 | A[i] = B[i-2] + B[i-1] + B[i] + B[i+1] + B[i+2] | 1 个加载流,1 个存储流 |
NVIDIA-H100-PCIe / CUDA 11.7 的结果
块大小线程 %occ | 初始化读取比例三重轴 3pt 5pt 32 3648 3 % | GB/秒:228 96 183 254 168 164 64 7296 6.2 % | GB/秒:452 189 341 459 316 310 96 10944 9.4 % | GB/秒:676 277 472 635 443 436 128 14592 12.5 % | GB/秒:888 368 607 821 567 558 160 18240 15.6 % | GB/秒:1093 449 704 966 680 670 192 21888 18.8 % | GB/秒:1301 533 817 1121 794 781 224 25536 21.9 % | GB/秒:1495 612 925 1264 903 889 256 29184 25.0 % | GB/秒:1686 702 1037 1399 1005 989 288 32832 28.1 % | GB/秒:1832 764 1124 1487 1100 1082 320 36480 31.2 % | GB/秒:2015 841 1213 1564 1188 1169 352 40128 34.4 % | GB/秒:2016 908 1295 1615 1269 1250 384 43776 37.5 % | GB/秒:2016 985 1378 1644 1348 1326 416 47424 40.6 % | GB/秒:2016 1045 1439 1641 1415 1395 448 51072 43.8 % | GB/秒:2016 1116 1497 1649 1472 1453 480 54720 46.9 % | GB/秒:2016 1179 1544 1655 1521 1505 512 58368 50.0 % | GB/秒:2017 1261 1583 1675 1556 1545 544 62016 53.1 % | GB/秒:2016 1300 1591 1669 1572 1563 576 65664 56.2 % | GB/秒:2016 1362 1607 1678 1587 1579 608 69312 59.4 % | GB/秒:2018 1416 1619 1689 1598 1592 640 72960 62.5 % | GB/秒:2016 1473 1639 1712 1613 1607 672 76608 65.6 % | GB/秒:2016 1527 1638 1714 1618 1613 704 80256 68.8 % | GB/秒:2015 1578 1644 1725 1625 1619 736 83904 71.9 % | GB/秒:2016 1624 1651 1738 1632 1628 768 87552 75.0 % | GB/秒:2016 1680 1666 1755 1642 1638 800 91200 78.1 % | GB/秒:2015 1714 1663 1758 1645 1642 832 94848 81.2 % | GB/秒:2016 1759 1668 1770 1649 1647 864 98496 84.4 % | GB/秒:2016 1795 1673 1779 1654 1651 896 102144 87.5 % | GB/秒:2016 1837 1686 1796 1663 1662 928 105792 90.6 % | GB/秒:2018 1871 1684 1800 1666 1664 960 109440 93.8 % | GB/秒:2016 1897 1688 1808 1672 1670 992 113088 96.9 % | GB/秒:2016 1919 1693 1818 1678 1675 1024 116736 100.0 % | GB/秒:2016 1942 1704 1832 1686 1683
SCALE 内核和所选 GPU 的结果:
请注意,H100 结果适用于 PCIe 版本,其 DRAM 带宽低于 SXM 版本!
用于延迟测量的指针追逐基准。单个扭曲以随机顺序完全遍历缓冲区。分区方案用于确保所有高速缓存行在再次访问之前都恰好命中一次。时钟周期中的延迟是根据当前时钟速率计算的。
Sharp L1 缓存转换对于 NVIDIAS V100/A100/H100 为 128/192/256 kB,对于 AMD MI210 为 16kB。 V100和MI210都有6MB二级缓存。 A100 和 H100 具有 2x20MB 和 2x25MB 的分段 L2 缓存,当从较远的 L2 部分获取数据时,这表现为一个小的中间平台。
RDNA2 GPU RX6900XT 拥有最有趣的缓存层次结构,其 4 个缓存级别清晰可见:16kB L0 缓存、128kB 半共享 L1 缓存、4MB L2 缓存和 128MB 无限缓存。它也是主频最高的 GPU,因此绝对访问时间将低于其他 GPU。测量其 DRAM 延迟很困难,因为 DRAM 接口无法为单个波前计时,导致 DRAM 延迟 > 2000 个周期。
测量第一级和第二级缓存的带宽。每个 SM 启动一个线程块。每个线程块重复读取同一缓冲区的内容。不同的缓冲区大小会改变目标缓存级别。
16kB (MI100/MI210)、128kB (V100)、192kB (A100) 和 256 kB (H100) 一级缓存容量非常明显和锐利。三种NVIDIA架构的传输速度都接近128B/cycle/SM,AMD的MI100和MI210上的最大测量值取决于数据类型。对于双精度,最大值为 32B/cycle/CU。对于单精度和 16B 数据类型(float4 或 double2),带宽高达 64B。
该基准测试不针对超过第二高速缓存级别的内存层次结构级别(即大多数 GPU 的 DRAM),因为数据集不会明显地从共享高速缓存中删除。由于所有线程块都读取相同的数据,因此在数据被逐出之前,共享缓存内部存在大量重用潜力。 RX6900XT 的价值超过其 128kB 共享 L1 缓存。当超出单个缓存部分的容量时,A100 和 H100 略有下降,为 20/25MB。超过这一点,数据就无法在两个二级缓存部分中复制,并且最大带宽也会下降,因为数据还必须从其他部分获取。
测量共享缓存级别的带宽。该基准测试明确不针对 L1 缓存。
所有三个 GPU 都具有相似的 L2 缓存带宽,约为 5.x TB/s,但容量不同。
一个值得注意的现象是 RX6900XT,它具有第二级共享缓存,即 128MB 无限缓存。其速度接近 1.92 TB/s,与 A100 的 DRAM 一样快。一开始,可以看到RX6900XT半共享L1缓存,对于某些块的放置,4个L1缓存的影响很小。这同样适用于 H100,它具有更大的 L1 缓存,线程块更有可能在前一个线程块加载的 L1 缓存中找到它想要处理的数据。这仅适用于小数据集,其中只有几个不同的数据块,并且这种机会仍然很大。这不能归因于分布式共享内存网络,该网络允许从其他 SM 的共享内存加载,因为它仅适用于显式共享内存加载,不适用于全局加载。这需要针对任何负载检查 GPC 中每个 L1 缓存的标签。
只读 L1 缓存基准测试,以 1 到 128 的步幅访问内存。带宽转换为每周期字节数和 SM。从 1 到 128 的步长采用 16x8 的画面格式,因为这突出显示了 2/4/8/16 的倍数的重复模式。
每个设备都适合
它通过启动开销对性能进行建模
该程序通过改变内循环行程的数量来扫描一系列计算强度。 它既适合研究从内存到计算绑定代码的转变,也适合研究使用多个 GPU 时的功耗、时钟频率和温度。 shell 脚本 series.sh 为每个值构建一个可执行文件,并在构建完成后逐个执行它们。
该代码在所有可用设备上同时运行。四个 Tesla V100 PCIe 16GB 上的输出示例:
1 640 块 0 其 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 138 W 60°C2 640 块 0 其 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 137 W 59°C3 640 块 0它是0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 56°C0 640 块 0 其 0.125 Fl/B 869 GB/s 109 GF/s 1380 Mhz 124 W 54°C1 640 块 8 其 1.125 Fl/B第861章GB/s 968 GF/s 1380 Mhz 159 W 63°C0 640 块 8 其 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 142 W 56°C2 640 块 8 其 1.125 Fl/B 861 GB/s 968 GF/秒1380 Mhz 157 W 62°C3 640 块 8 其 1.125 Fl/B 861 GB/s 968 GF/s 1380 Mhz 144 W 59°C[...]0 640 块 64 其 8.125 Fl/B 811 GB/s 6587 GF /秒1380兆赫223 W 63°C3 640 块 64 其 8.125 Fl/B 813 GB/s 6604 GF/s 1380 Mhz 230 W 66°C1 640 块 64 其 8.125 Fl/B 812 GB/s 6595 GF/s 1380 Mhz 241 W 71°C2 640 块 64 其 8.125 Fl/B 813 GB/s 6603 GF/s 1380 Mhz 243 W 69°C
测量 cudaMemcpy 函数在一定传输大小范围内的主机到设备传输速率
Tesla V100 PCIe 16GB 的输出示例
1kB 0.03ms 0.03GB/s 0.68% 2kB 0.03ms 0.06GB/s 5.69% 4kB 0.03ms 0.12GB/s 8.97% 8kB 0.03ms 0.24GB/s 6.25% 16kB 0.04ms 0.44GB/s 5.16% 32kB 0.04ms 0.93GB/秒 2.70% 64kB 0.04ms 1.77GB/秒 5.16% 128kB 0.04ms 3.46GB/秒 7.55% 256kB 0.05ms 5.27GB/秒 1.92% 512kB 0.07ms 7.53GB/s 1.03% 1024kB 0.11ms 9.25GB/s 2.52% 2048kB 0.20ms 10.50GB/s 1.07% 4096kB 0.37ms 11.41GB/s 0.58% 8192kB 0.71ms 11.86GB/秒 0.44% 16384kB 1.38ms 12.11GB/秒 0.14% 32768kB 2.74ms 12.23GB/秒 0.03% 65536kB 5.46ms 12.29GB/秒 0.08% 131072kB 10.89ms 12.32GB/秒 0.02% 262144kB 21.75ms 12.34GB/秒 0.00% 524288kB 43.47ms 12.35GB/秒 0.00% 1048576kB 86.91ms 12.35GB/秒 0.00%
使用 STREAM triad 内核测量 CUDA 统一内存传输速率。使用一系列数据集大小,比设备内存小或大。 Tesla V100 PCIe 16GB 上的示例输出:
缓冲区大小 时间扩展带宽 24 MB 0.1ms 3.2% 426.2GB/s 48 MB 0.1ms 24.2% 511.6GB/s 96 MB 0.1ms 0.8% 688.0GB/s 192 MB 0.3ms 1.8% 700.0GB/s 384 MB 0.5ms 0.5 % 764.6GB/秒 768MB 1.0毫秒 0.2% 801.8GB/秒 1536MB 2.0毫秒 0.0% 816.9GB/秒 3072MB 3.9毫秒 0.1% 822.9GB/秒 6144MB 7.8毫秒 0.2% 823.8GB/秒 12288MB 15.7ms 0.1% 822.1GB/s 24576 MB 5108.3ms 0.5% 5.0GB/s 49152 MB 10284.7ms 0.8% 5.0GB/s
测量 FMA、DIV 和 SQRT 操作的延迟和吞吐量。它通过生成 1..8 个独立依赖链来扫描 ILP=1..8 的组合,通过将 SM 上的扭曲计数从 1 更改为 32 来扫描 TLP。最终输出是一个 ILP/TLP 表,其倒数为吞吐量(每次操作的周期):
Tesla V100 PCIe 16GB 上的示例输出:
DFMA 8.67 4.63 4.57 4.66 4.63 4.72 4.79 4.97 4.29 2.32 2.29 2.33 2.32 2.36 2.39 2.48 2.14 1.16 1.14 1.17 1.16 1.18 1.20 1.24 1.08 1.05 1.05 1.08 1.08 1.10 1.12 1.14 1.03 1.04 1.04 1.08 1.07 1.10 1.11 1.14 1.03 1.04 1.04 1.08 1.07 1.10 1.10 1.14DDIV111.55 111.53 111.53 111.53 111.53 668.46 779.75 891.05 55.76 55.77 55.76 55.76 55.76 334.26 389.86 445.51 27.88 27.88 27.88 27.88 27.88 167.12 194.96 222.82 14.11 14.11 14.11 14.11 14.11 84.77 98.89 113.00 8.48 8.48 8.48 8.48 8.48 50.89 59.36 67.84 7.51 7.51 7.51 7.51 7.51 44.98 52.48 59.97DSQRT101.26 101.26 101.26 101.26 101.26 612.76 714.79 816.83 50.63 50.62 50.63 50.63 50.62 306.36 357.38 408.40 25.31 25.31 25.31 25.31 25.31 153.18 178.68 204.19 13.56 13.56 13.56 13.56 13.56 82.75 96.83 110.29 9.80 9.80 9.80 9.80 9.80 60.47 70.54 80.62 9.61 9.61 9.61 9.61 9.61 58.91 68.72 78.53
可以从图中提取一些特征。
延迟:
DFMA:8 个周期
DDIV:112 个周期
DSQRT:101 个周期
1 个 warp 的吞吐量(在一个 SM 象限上运行),无依赖性:
DFMA:每个周期 1/4(ILP 2,到操作重叠)
DDIV:每个周期 1/112(无 ILP/重叠)
DSQRT:每个周期 1/101(无 ILP/重叠)
多个扭曲的吞吐量(所有 SM 象限),依赖性不相关:
DFMA:每个周期 1 个
DDIV:1/7.5 周期
DSQRT:1/9.6 周期