多核场景,对矩阵进行切分时,若M、N、K无法整除singleCoreM 、singleCoreN、 singleCoreK时,就会出现尾块,即多核非对齐场景。如下图矩阵A、B的最后一行和最后一列的矩阵块:
此时,C矩阵中的R矩阵块,依然是通过A1*B1+A2*B2+A3*B3+A4*B4累加得到的,处理A1*B1、A2*B2、A3*B3、A4*B4等尾块时,需在kernel侧设置尾块大小,在不改变原有tiling的情况下,调用接口重新设置本次计算的singleCoreM/singleCoreN/singleCoreK,在处理尾块的时候按照设置的值也就是tailM/tailN/tailK进行搬运和计算。
多核处理Matmul矩阵计算,存在尾块的场景。
处理尾块调用的SetTail接口,需要在Iterate/IterateAll之前调用。
Matmul多核非对齐场景的完整样例请参考。该场景的关键代码示例如下。
[object Object]