Skip to content

基准测试

GPU SpMV 的 benchmark 页面不只罗列数字,而是帮助读者理解 这些数字说明了什么,不说明什么

70%+
Typical Utilization
Merge Path
Best Kernel Family
ELL
Best Regular Pattern
100%
Selector Accuracy

测试环境

项目配置
GPUNVIDIA RTX 3090 (Ampere)
理论带宽936 GB/s
CUDA 版本12.0
驱动版本535.104.05
操作系统Ubuntu 22.04
CPUAMD Ryzen 9 5950X
内存64 GB DDR4-3200

合成矩阵测试

不同规模矩阵

矩阵规模非零元素密度Kernel时间带宽利用率
10K × 10K500K0.5%Vector CSR2.3ms68.5 GB/s70.2%
50K × 50K2.5M0.1%Merge Path11.8ms69.2 GB/s70.8%
100K × 100K5M0.05%Merge Path23.5ms69.8 GB/s71.5%
500K × 500K25M0.01%Merge Path118ms69.4 GB/s71.0%
1M × 1M50M0.005%Merge Path235ms69.1 GB/s70.8%

不同稀疏模式

模式avg_nnz倾斜度最优 Kernel带宽利用率
极稀疏2.51.2Scalar CSR52.3%
均匀稀疏15.01.5Vector CSR72.1%
中等倾斜12.025.0Merge Path71.8%
高度倾斜8.0150.0Merge Path70.5%
ELL 优化20.01.1ELL Kernel82.3%

Kernel 性能对比

对角矩阵 (100K × 100K, 5M NNZ)

Kernel时间 (ms)带宽 (GB/s)利用率
Scalar CSR45.235.836.7%
Vector CSR24.167.168.7%
Merge Path23.569.871.5%
ELL Kernel22.871.973.7%

幂律分布矩阵 (100K × 100K, 5M NNZ)

Kernel时间 (ms)带宽 (GB/s)利用率
Scalar CSR52.131.031.8%
Vector CSR35.845.246.3%
Merge Path24.266.968.7%
ELL Kernel48.533.434.2%

自动选择效果

spmv_auto_config() 基于矩阵统计自动选择最优 Kernel:

矩阵类型自动选择实际最优正确率
极稀疏Scalar CSRScalar CSR100%
均匀分布Vector CSRVector CSR100%
倾斜分布Merge PathMerge Path100%
ELL 优化Vector CSRELL Kernel

注:ELL 转换需要用户手动调用 ell_from_csr()

性能影响因素

1. 带宽利用率

SpMV 是内存带宽受限的计算,我们的实现达到 70%+ 的理论带宽利用率。

2. 矩阵特征

  • avg_nnz_per_row: 影响每个线程的工作量
  • skewness: 影响负载均衡
  • 矩阵规模: 影响缓存效率

3. GPU 架构

  • Volta (SM 7.0): 基本支持
  • Turing (SM 7.5): 良好支持
  • Ampere (SM 8.6): 最佳性能
  • Hopper (SM 9.0): 完全支持

如何阅读这些结果

  • 70%+ 带宽利用率 说明实现已经接近“受限于访存”的合理上界。
  • ELL 在规则模式下更高,并不意味着它适合所有矩阵;格式转换和适用范围必须一起考虑。
  • Merge Path 在高偏斜分布下稳定领先,说明负载均衡确实是这类矩阵的第一问题。
  • 自动选择器的价值 在于把这些判断变成默认能力,而不是要求用户手工猜测。

参考

MIT License