本项目实现并优化了用于计算矩阵 B 的 CUDA 核函数(上三角区域累加三元关系),从基线到多级优化逐步提升访存效率、数据复用度与有效算术密度,最终显著加速。
- v1(compute_B_kernel_float_v1): 基线实现。每线程负责一个
(row,col),遍历全部k,直接从全局内存读取S/R/D,对称写回。 - v1_smem(compute_B_kernel_float_v1_smem): 引入共享内存 tile 复用。将当前 tile 的
row/col行搬入 smem(转置布局避免 bank 冲突),命中时显著降低全局读取。 - v2(compute_B_kernel_float_v2): 访存顺序与按需加载优化。先判
S合法再读R/D,减少无效内存访问;k方向顺序访问更友好缓存。 - v3(compute_B_kernel_float_v3): 三路合并读(
zip_kernel将S/R/D打包为float4),一次合并访问替代多次离散加载,并做轻度循环展开提升 ILP。 - v4(compute_B_kernel_float_v4): K 维按 tile 稀疏剪枝 + 三维网格分段归约。在线构建
skipTile掩码跳过无效k段,grid.z覆盖kTile提升并行度,分段和用原子加写回。
func_kernel.cu: CUDA 核函数与主机侧封装(v1/v2/v1_smem/v3/v4)。include/func_kernel.cuh: 头文件声明。export.cpp: PyTorch C++ 扩展导出接口。test_v3.py: 示例/测试脚本。ncu_profile.sh: Nsight Compute 性能采样脚本。baseline_v1.ncu-rep: 基线 ncu 报告(示例)。
python test_v3.pybash ncu_profile.sh可对比各内核版本的时间、带宽、指令与 stall 分布;重点关注内存事务、L2 命中、原子冲突与 FLOPs/Byte 的变化。
- 访存优化:按需加载、
float4合并读、共享内存 tile 复用、避免 bank 冲突。 - 计算优化:条件合并、轻度展开、分段并行与原子分段归约。
- 剪枝策略:
build_skip_tile_mask_online对k维按 tile 做存在性检查,整段无效则直接早停,显著减少无效 FLOPs。
详细原理、优化路径与对比数据请见知乎: 0.5x: 3DV算子优化思路