本文档定义了项目的核心概念和术语,供 AI 工具和人类开发者参考。
位置: src/kernels/tensor_core_sgemm.cuh
深层模块,提供完整的 Tensor Core SGEMM 功能:
- 能力查询:
tensorCoresAvailable(),tensorCoreDimensionsSupported(),getTensorCoreArchName() - 计算内核:
float_to_half_kernel,launch_tensor_core_sgemm_fp16(),launch_tensor_core_sgemm_fp16_fast_path() - 统一接口:
launch_tensor_core_sgemm_with_fallback()- 端到端 FP32 入口点(强制显式指定 fallback) - 容差常量:
kTensorCoreVerifyTolerance- Tensor Core 验证容差(FP16 中间精度)
设计原则:
- 深度提升:小接口(能力查询 + 启动入口),大实现(WMMA 内核 + 类型转换 + fallback 逻辑)
- 不提供默认 fallback:调用者必须显式指定 fallback 策略
- 编译期解耦:Tensor Core 模块不依赖任何具体内核
位置: src/kernels/tensor_core_benchmark.cuh
Tensor Core 特有的 benchmark 功能,提供:
runTensorCoreComputeOnlyBenchmark()- 纯计算路径性能测试
接口设计:只接受 cublasHandle_t,不依赖整个 SGEMMBenchmark 类,避免内核层对工具层的上穿依赖。
位置: src/utils/verify.cuh
统一的验证逻辑:
detail::compareMatricesImpl()- 内部实现,供其他函数共享compareMatrices()- 独立的矩阵比较函数SGEMMVerifier- 带 cuBLAS 句柄的验证器类
项目将 Benchmark 功能拆分为三个深度模块,每个模块有独立的职责:
位置: src/utils/benchmark_core.cuh
核心性能测量:
CudaTimer- RAII 包装的 CUDA 事件计时器measureGpuTime()- 通用的 GPU 操作性能测量器
位置: src/utils/benchmark_metrics.cuh
指标计算:
PerformanceMetrics- 性能指标结构体calculateSgemmMetrics()- 计算 SGEMM 性能指标getTheoreticalPeakGflops()/getTheoreticalPeakBandwidth()- 理论峰值查询calculateEfficiency()/calculateBandwidthUtilization()- 效率计算
位置: src/utils/benchmark.cuh
聚合模块并提供:
SGEMMBenchmark- 高级 benchmark 编排器BenchmarkResult- 结果结构和报告生成
项目采用分层测试策略,确保每个层级都有独立的测试面:
位置: tests/test_sgemm.cu
测试内核的正确性:
- 参数化正确性测试(5 个内核 + 多维度组合)
- Tensor Core 快速路径和 fallback 测试
- 边界测试和维度不变性测试
位置: tests/test_utils.cu
测试工具模块的独立接口:
DeviceMemory- RAII 内存管理、移动语义、边界条件CublasHandle- cuBLAS 句柄生命周期SGEMMVerifier- 参考计算和验证逻辑VerifyTolerance- 容差配置和边界条件- NaN/Inf 处理、异常安全性
设计原则:工具层测试独立于内核测试,可以单独捕获工具类 bug。
位置: tests/test_performance.cu
检测性能退化:
- 为每个内核定义最小性能阈值(相对于理论峰值的百分比)
- 测量实际 GFLOPS 并与阈值比较
- 支持基线数据持久化(存储在
tests/baselines/)
性能阈值:
- Naive: 5% 峰值
- Tiled: 20% 峰值
- Bank-Conflict-Free: 30% 峰值
- Double-Buffer: 35% 峰值
- Tensor Core: 50% 峰值(当可用时)
设计原则:性能测试独立于正确性测试,可在 CI 中检测重大性能退化。
- 应用层 (
main.cu,cli_parser.cuh,benchmark_runner.cuh)main.cu- 入口点,仅负责组装cli_parser.cuh- 命令行解析、配置构造benchmark_runner.cuh- 内核调度、结果聚合
- 内核层 (
src/kernels/) - 5 个内核实现 + Tensor Core 专用模块 - 工具层 (
src/utils/) - RAII 内存管理、错误处理、验证辅助
- 应用层 → 内核层 → 工具层
- 内核层可以依赖工具层
- 工具层不应依赖内核层(通过适配器解耦)
- 深层模块: 小接口,大实现(高杠杆)
- 浅层模块: 接口复杂度接近实现复杂度(应避免或合并)
| 内核 | 文件 | 优化技术 |
|---|---|---|
| Naive | naive_sgemm.cuh |
基础三重循环,基准实现 |
| Tiled | tiled_sgemm.cuh |
共享内存分块,数据复用 |
| Bank-Free | bank_conflict_free_sgemm.cuh |
共享内存填充,消除 bank 冲突 |
| Double-Buffer | double_buffer_sgemm.cuh |
双缓冲,计算与传输重叠 |
| Tensor Core | tensor_core_*.cuh |
WMMA API,混合精度 FP16→FP32 |