自定义CUDA核、cuBLAS与cuTENSOR矩阵乘法性能对比
CUDA矩阵乘法性能相关问题解答
测试背景
测试环境:Ubuntu 24.04系统,计算能力7.5的Quadro T1000 Mobile GPU(驱动
nvidia-driver-535)
测试内容:自定义CUDA核、cuBLAS v12.0.1、cuTENSOR v2.0.2.4的方阵乘法性能
测试结果:自定义核耗时15.352ms;cuBLAS与cuTENSOR均调用volta_sgemm_128x64_nn核,耗时分别为4.628ms、4.879ms;该GPU无硬件Tensor Core但支持Tensor指令
1. cuBLAS与cuTENSOR性能接近是否符合预期?
完全符合预期。因为你的GPU没有硬件Tensor Core,cuTENSOR无法利用Tensor Core的专属加速能力,此时它执行常规单精度矩阵乘法(SGEMM)时,底层直接调用了和cuBLAS相同的Volta架构SGEMM优化核volta_sgemm_128x64_nn。两者的性能差异仅来自上层API的微小调用开销、参数预处理等环节,这种毫秒级的差距属于正常范围。
2. volta_sgemm_128x64_nn核具体执行逻辑是什么?
这是NVIDIA为Volta架构(计算能力7.x)量身优化的单精度通用矩阵乘法核:
128x64代表每个线程块负责计算的输出矩阵tile尺寸,nn表示输入矩阵A、B均为非转置状态(No Transpose)。- 核心执行逻辑包括:
- 多级数据复用:把输入矩阵元素加载到共享内存、寄存器后,让多个线程重复访问,大幅减少全局内存的读写次数,最大化利用GPU内存带宽。
- 指令级并行与Tensor指令:利用Volta的SIMT特性,每个线程负责计算输出矩阵中的多个元素;同时借助GPU支持的
wmma等Tensor指令加速运算——即便没有硬件Tensor Core,这些指令也能提升单精度计算的效率。 - 均衡的线程划分:将大矩阵拆分成多个
128x64的tile,每个线程块处理一个tile,通过合理的线程映射让每个线程的计算任务均衡,避免硬件资源浪费。 - 内存访问对齐:确保全局内存的访问符合GPU的对齐要求,消除未对齐访问带来的性能损耗。
3. cuBLAS远快于自定义核是因核高度优化还是核心类型差异?
主要原因是cuBLAS的核经过了NVIDIA的深度硬件适配与优化,而非核心类型差异——你的自定义核和cuBLAS调用的都是通用CUDA核,并没有用到Tensor Core。
cuBLAS的核心优化点包括:
- 针对Volta架构的硬件参数(如共享内存大小、寄存器数量、指令集)做了极致适配,比如精准控制共享内存使用量,避免共享内存bank冲突,合理分配寄存器资源。
- 默认启用了Volta的
wmma等高级Tensor指令,而自定义核通常不会主动使用这些指令。 - 实现了高效的内存预取、数据复用策略,把内存带宽利用率拉到最高。
- 经过海量性能测试与调优,针对不同矩阵尺寸、数据类型都有对应的最优核实现。
而自定义核一般只实现基础的矩阵乘法逻辑,没有考虑这些底层硬件优化细节,所以性能差距会非常明显。
内容的提问来源于stack exchange,提问作者sof
相关产品推荐
相关产品推荐

