使用示例

以matmul算子为例,该用例表示准备处理[160, 240]和[240, 80]的矩阵乘,切割为5个[32, 48], [48, 16]的小矩阵做矩阵乘。main.py脚本样例如下:
from mskpp import mmad, Tensor, Chip
def my_mmad(gm_x, gm_y, gm_z):
    # 矩阵乘的基本数据通路:
    # 左矩阵A:GM-L1-L0A
    # 右矩阵B:GM-L1-L0B
    # 结果矩阵C: L0C(初始化)-GM
    l1_x = Tensor("L1")
    l1_y = Tensor("L1")
    l1_x.load(gm_x)
    l1_y.load(gm_y)
    x = Tensor("L0A")
    y = Tensor("L0B")
    x.load(l1_x)
    y.load(l1_y)
    z = Tensor("L0C", "FP32", [32, 16], format="NC1HWC0")
    out = mmad(x, y, z, True)() # 对于输出需要返回传出
    z = out[0]
    return z

if __name__ == '__main__':
    with Chip("Ascendxxxyy") as chip:
        chip.enable_trace()    # 使能算子模拟流水图的功能,生成trace.json文件
        chip.enable_metrics()   # 使能单指令及分PIPE的流水信息,生成Instruction_statistic.csv和Pipe_statistic.csv文件
        # 这里进入了对数据切分逻辑的处理,对一大块GM的数据,如何经过拆分成小数据分批次搬入,如何对
        # 内存进行分片多buffer搬运,都是属于tiling策略的范畴,这里模拟了单buffer情况,
        # 将[160, 240]和[240, 80]的矩阵乘,切割为5个[32, 48], [48, 16]的小矩阵分批次进行运算的一个tiling策略
        for _ in range(5):
            in_x = Tensor("GM", "FP16", [32, 48], format="ND")
            in_y = Tensor("GM", "FP16", [48, 16], format="ND")
            in_z = Tensor("GM", "FP32", [32, 16], format="NC1HWC0")
            out_z = my_mmad(in_x, in_y, in_z)
            in_z.load(out_z)
执行以上脚本后,可根据如下生成文件查看建模结果:

搬运流水统计

生成了搬运流水统计文件Pipe_statistic.csv,该文件统计了不同PIPE的总搬运数据量大小、操作数个数以及耗时信息。
图1 Pipe_statistic.csv
关键字段说明如下。
表1 字段说明

字段名

字段解释

Pipe

表示昇腾芯片中不同PIPE单元的名称。

Duration(us)

PIPE耗时,单位us。

Cycle

各个指令每次执行时消耗的cycle数。

Size(B)

表示搬运类PIPE的搬运量大小。

Ops

表示计算类PIPE的计算元素大小。

对于流水线耗时最长,明显是搬运性能瓶颈的PIPE,通常有如下优化思路:

指令信息统计

生成了指令信息统计文件Instruction_statistic.csv,该文件统计了不同指令维度的总搬运数据量大小、操作数个数以及耗时信息,能够发现指令层面上的瓶颈主要在MOV-GM_TO_L1(属于PIPE-MTE2),从指令层面找到了性能瓶颈处。

图2 Instruction_statistic.csv
关键字段说明如下。
表2 字段说明

字段名

字段解释

Instruction

指令名称。

Duration(us)

PIPE耗时,单位us。

Cycle

各个指令每次执行时消耗的cycle数。

Size(B)

表示搬运类PIPE的搬运量大小。

Ops

表示计算类PIPE的计算元素大小。

指令占比饼图

生成了指令占比饼图instruction_cycle_consumption.html,从中可以发现MOV-GM_TO_L1是算子里的最大瓶颈。

图3 指令耗时统计

指令流水图

生成了流水图文件trace.json,通过查看该文件可以发现在理想的流水中,性能瓶颈的PIPE-MTE2是需要能够一直进行运转的。

在Chrome浏览器中输入“chrome://tracing”地址,将.json文件拖到空白处并打开,通过键盘上的快捷键(w:放大,s:缩小,a:左移,d:右移)进行查看。

图4 trace.json

单击流水图中的“MOV-GM_TO_L1”单指令,可查看该指令在当前搬运量及计算量下的cycle数和带宽,如图5 指令详细信息所示。

图5 指令详细信息