YunSDR小课堂-AIE编程指南(第51讲)

使用AI引擎API的示例设计

矩阵乘法

AI引擎API为基于向量的矩阵乘法提供了一个aie::mmul类模板。多个中间矩阵相乘的结果被累加以给出最终结果。有关支持的矩阵乘法形状(M*K*N)和数据类型的更多详细信息,请参阅《AI Engine API用户指南》(UG1529)中的矩阵乘法。AIE::MMUL操作MUL和MAC接受用于基于向量的矩阵乘法的行主格式数据。然后,对于aie::mmul的Mac操作,按M*K或K*N排列数据。这种数据洗牌可以在PL或AI引擎中完成。本节给出了A(*)×B(*)矩阵乘法的一个例子。数据类型为int8 x int8。选择矩阵乘法形状4*16*8用于AIE::MMUL运算。假定输入数据为行优先格式。将数据作为4×16矩阵和16×8矩阵输入到矩阵乘法核。在矩阵乘法核之前,对输入数据进行混洗。例如,在混洗之前,将矩阵A(*)与a0、a1、…一起存储在存储器中,A63,A64,…,按顺序排列为A4096。AIE::MMUL运算将使用形状4*16。矩阵A被分割成大小为4*16的较小矩阵。对于较小的矩阵A00,对于AIE::MMUL,应顺序获取A0到A15、A64到A79、A128到A143和A192到A207。因此,数据混洗的目的是将A0到A15、A64到A79、A128到A143和A192到A207放入矩阵乘法内核的连续存储中。这种数据洗牌如下图所示。

1.png

类似地,输出数据被混洗。下图显示了设计图。

2.png

向量化矩阵乘法

    下面是一个矩阵乘法的例子,矩阵大小为(64 * 64)x(64 * 64),数据类型为int8 x int8。矩阵乘法的形状是4*16*8。输入数据被重新整形以用于矩阵乘法。

3.png

 分析的结果表明,循环大约需要3254个周期。总共,这是对int 8 * int 8数据类型的64 *64*64=262144次乘法,即每个周期262144/3254 ~=80次int 8 * int 8 MAC运算。注意:根据特定编译器设置和所用工具的版本,准确的周期数可能会略有波动。然而,无论这些变化如何,本节中描述的分析技术仍然是相关的和适用的。

数据混洗内核

    由于aie::mmul接受行为主格式的向量数据用于矩阵乘法的形状,因此可能需要在PL或AI引擎中使用原始数据进行数据重排以提高性能。本节假设原始数据是整个矩阵的行为主格式。它将数据混洗以匹配矩阵乘法中使用的形状4*16*8。

    以下内核代码将矩阵A的数据混洗,目标形状为4*16:

4.png

5.png

文章来源:威视锐科技