项目原计划通过对GEMM算子的不断优化,达到与cublas库中相近的性能,并在此过程中完成对cuda及SIMT相关的并行计算框架的学习。但目前因为某些原因,性能暂未达到预期,故仅作现阶段对cuda理解的展示。为方便开发,对GEMM中的输入全部采用了方阵,既M = N = K, 且不考虑需要进行PADDING的场景。本地测试设备为NVIDIA RTX 1050TI,CUDA版本11.0。
当前版本的gemm优化方法 my_balanced_tiling_gemm
主要采用了 shared mem 缓存加速以及分块乘法的原理,在输入维度128-1024的测试范围中,性能的复杂度上可以达到与cublas同阶。但在线性倍率的差距上十分巨大。目前通过一部分case的测试可以推断出,主要差异来自于 shared mem 的带宽与假设不相符。但由于本地profiler等调试工具(nvprof, Nsight)不能正常使用且该显卡日常使用中确实存在一定偶发性故障,故而目前不能确认是软件调度问题亦或是硬件问题,在此暂停。
后续继续优化思路:
- 通过拆解循环模式下 i,j,k 维度的顺序,变换分块矩阵乘的顺序来减小输入中某一边tensor的读取次数。或利用shared mem的缓存累加减小到输出方向的写出次数。
- 通过pipeline的方式优化或掩盖数据搬运时的带宽延迟。
- 学习指令集中是否有更合适的矩阵加速操作。