本节提供了一系列包含Matmul计算的算子性能调优案例,开发者可根据实际应用场景,参考相关案例中的优化方法和思路,应用于具体实践中。案例分为如下五类,各分类的简介请参见如下表格,详细内容请阅读后续章节。
分类 |
适用场景 |
相关案例 |
|---|---|---|
Tiling优化:优化Tiling分核及基本块切分策略。 |
数据量足够多的大Shape场景。 |
分类 |
适用场景 |
相关案例 |
|---|---|---|
多核间任务并行:合理地将数据分配给不同的核来执行任务。 |
矩阵的K轴较大、M轴和N轴相比K轴较小的场景。 |
|
多核间数据访问并行:优化多核数据并行访问机制,如多核场景同一内存数据的地址访问冲突优化,实现多核数据访问效率提升。 |
多核执行Matmul,输入矩阵的K轴较大且K轴非全载的场景。 |
|
单核内流水并行:利用不同指令队列间的相互独立性和可并行执行特性,优化核内流水并行度。 |
|
分类 |
适用场景 |
相关案例 |
|---|---|---|
内存共享与复用:通过Buffer的共享与缓存复用,减少重复的数据搬运带来的开销。 |
MIX场景下,多个AIV的A矩阵或B矩阵GM地址相同,且多个AIV复用的A矩阵或B矩阵在L1 Buffer上全载。 |
|
内存对齐:确保处理的数据满足特定的对齐要求,针对非对齐数据使用不同的搬运策略,以提升数据搬运的效率。 |
输入矩阵内轴非256字节对齐,且数据量较大的场景。 |
分类 |
适用场景 |
相关案例 |
|---|---|---|
Tiling常量化:在Kernel编译期间完成Matmul Tiling的计算,由变量转化为常量扩散到系统中,减少Scalar提升性能。 |
Matmul初始化时的Scalar计算较多,影响指令头开销。 Matmul迭代之间的Scalar计算较多,阻塞MTE2流水。 |
|
纯Cube模式:减少消息处理机制带来额外的Scalar开销。 |
相较于MIX模式,没有矢量计算,只有矩阵计算的场景。 |
分类 |
适用场景 |
相关案例 |
|---|---|---|
搬运吞吐量优化:通过合理控制搬运数据块的大小,提升带宽利用效率,实现搬运效率的提升。 |
|
|
预加载搬运:预加载需要搬运的数据块,减少流水之间的间隙。 |
MTE2流水间隙较大,且M或N数值较大的场景。 |