开发者
资源
[object Object][object Object]

为了实现多核并行,提升计算效率,需要将矩阵数据进行切分,分配到不同的核上进行处理。主要的切分策略有切分K轴和不切分K轴两种。

不切分K轴、仅切分M、N轴的策略如下:

  • 对于A矩阵,沿着M轴进行切分,切分成多份的singleCoreM,单核上处理SingleCoreM * K大小的数据。
  • 对于B矩阵,沿着N轴进行切分,切分成多份的singleCoreN,单核上处理K * SingleCoreN大小的数据。
  • 对于C矩阵,SingleCoreM * K大小的A矩阵和K * SingleCoreN大小的B矩阵相乘得到SingleCoreM * SingleCoreN大小的C矩阵,即为单核上输出的C矩阵大小。

比如,下图中共有8个核参与计算,将A矩阵沿着M轴划分为4块,将B矩阵沿着N轴切分为两块,单核上仅处理某一分块(比如图中绿色部分为core5上参与计算的数据):SingleCoreM * K大小的A矩阵分块和SingleCoreN * K大小的B矩阵分块相乘得到SingleCoreM * SingleCoreN大小的C矩阵分块。

切分M、N、K轴的策略如下图所示:

  • 对于A矩阵,沿着M轴进行切分,切分成多份的singleCoreM,沿着K轴切分,切分成多份的singleCoreK,单核上处理singleCoreM * singleCoreK大小的数据。
  • 对于B矩阵,沿着K轴进行切分,切分成多份的singleCoreK,沿着N轴进行切分,切分成多份的singleCoreN,单核上处理singleCoreK * singleCoreN大小的数据。
  • 对于C矩阵,singleCoreM * singleCoreK大小的A矩阵与singleCoreK * singleCoreN大小的B矩阵相乘并累加得到singleCoreM * singleCoreN大小的C矩阵分块。

比如下图中,C矩阵中的R矩阵块,是通过A1*B1+A2*B2+A3*B3累加得到的,其中,A1*B1、A2*B2、A3*B3可在多个核上并行计算。

上述的切分策略会在Tiling参数中体现,比如SingleCoreM、SingleCoreN、SingleCoreK,开发者在host侧通过调用API自动获取Tiling参数,与单核场景的不同的是,多核Tiling需要使用构造多核Tiling对象,并通过接口设置Matmul计算所用的核数。注意:这里设置的核数为Matmul计算可用的核数,仅在多核场景下设置,用于计算tiling参数;SetBlockDim为整个算子计算所用核数,是实际会加载的核数,是必须设置的。SetBlockDim的设置规则请参考。SetDim的设置规则如下:

  • 纯Cube模式(只有矩阵计算)场景,本节内容以纯Cube模式举例。

    设置当前AI处理器可用的核数,通过得到执行Matmul计算实际使用的核数,实际使用的核数小于等于AI处理器可用的核数。SetBlockDim按照实际使用的核数由用户进行配置。

  • MIX模式(包含矩阵计算和矢量计算)的设置规则请参考

[object Object]

多核处理Matmul矩阵计算场景。

[object Object]

[object Object]

该场景的关键代码示例如下。Matmul多核对齐场景的完整样例请参考:多核切M、N的样例:;多核切K的样例:

[object Object]