CANN/catlass StreamK矩阵乘法模板

发布时间:2026/7/15 3:06:02

CANN/catlass StreamK矩阵乘法模板 StreamkMatmul【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass1 模板说明StreamkMatmul模板是为了更极致的负载均衡而设计相比多核切K模板改进的地方在于StreamkMatmul模板可以通过K方向的切分将任务量完全均衡的分配到所有核心上。例如M512N2048K1280的Matmul假设L1Tile为m1128n1256k1256这时划分出来的任务数量为32假设核心数量为20那么第二轮计算的时候将有8个核心空闲如果采用MultiCoreSplitkMatmul模板将K方向切分一次那么任务数变为64那么第四轮计算的时候有16个核心空闲还是负载不均衡。但是如果使用StreamkMatmul模板 可以将第二轮的计算任务均分到20个核心上从而做到比较严格的负载均衡。StreamkMatmul的具体详细原理请参考论文Stream-K: Work-centric Parallel Decomposition for Dense Matrix-Matrix Multiplication on the GPU。1.1 模板原理如图所示对于M512N2048K1280的Shape共有32个任务块假设有20个核心需要分两轮完成计算图中的Swizzle请参考swizzle_explanation第一轮每个核心都有一个任务块负载是均衡的所以不关心第一轮但是第二轮只有12个任务块计算有8个核心空闲如图所示一共有12个任务块每个核心计算一个完整任务块由于K1280k1256所以每个核心沿K方向切分为5份在L0C上完成累加最终得到一个任务块的完整结果。如果第二轮采用Streamk的思想对K进行多核切分即有12*560份计算任务有20个核心每个核心计算3个任务如图所示这样第二轮计算的负载就均匀分到了所有核心上。有的核心将会计算当前任务块尾段的K Tile以及下一个任务块首段的K Tile例如core 1这两段计算结果属于不同结果块的部分和需要分开存储到workspace。每个核心分配两片workspace总的workspace大小为2*m1*n1*sizeof(ElementAccumulator)*CoreNumworkspace大小和shape无关为固定大小。Matmul计算完成后需要AIV进行部分和的累加得到最终的完整结果例如20号任务块有两个部分和分别由core0和core1计算完成那么由core0对应的两个AIV完成累加。21号块由core1、core2、core3计算完成那么由core1、core2对应的四个AIV完成累加。1.2 关键优化点尾轮切分只针对尾轮进行切分其他轮次不切分K直接将计算结果写回到GM_C尾轮计算时每个核心先将部分和写入到对应的workspace然后由对应的AIV完成部分和的累加。因为Streamk的目的是保证负载均衡非尾轮的计算负载本身就是均衡的就不需要K切分了这样做也可以减少累加开销。1.3 关键优化点提前计算尾轮将尾轮提前到倒数第二轮进行计算将尾轮提前好处是Vector可以提前开始累加操作和后面的Cube计算并行处理这样Vector的累加开销可以被掩盖掉。1.4 其他优化StreamkMatmul模板中用到了Preload、ShuffleK、Padding以及特殊场景的读取优化等CommonMatmul中已有的优化点。2 适用场景尾轮负载不均衡。【免费下载链接】catlass本项目是CANN的算子模板库提供NPU上高性能矩阵乘及其相关融合类算子模板样例。项目地址: https://gitcode.com/cann/catlass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻