非对齐场景

本节介绍非32字节对齐数据的更多处理方式,包括数据搬入、计算和搬出的处理。用户在实际算子开发中,可以参考如下方案介绍和算子样例灵活地处理非对齐场景。

数据搬运和Vector计算的对齐要求

进行数据搬运和Vector计算时,对于搬运的数据长度和操作数的起始地址有如下的对齐要求:

  • 使用DataCopy接口进行数据搬运,搬运的数据长度和操作数的起始地址(UB上)必须保证32字节对齐。
  • 通常情况下,进行Vector计算时,操作数的起始地址必须保证32字节对齐。具体对齐要求需要查阅对应的API参考进行确认。

下文描述中的Global指Global Memory上的tensor,Local指Local Memory上的tensor。

下面是一些非对齐搬运和计算的例子。

非对齐处理方案

DataCopyPad接口提供非对齐搬运的功能,如果基于该接口支持的产品开发算子(参见支持的型号),则可以直接使用该接口解决非对齐场景下的搬运问题。使用DataCopyPad的完整示例请参考DataCopyPad样例(工程化算子开发)DataCopyPad样例(kernel直调)

部分型号不支持DataCopyPad接口,需要参考如下的方案处理。

图4 非对齐处理方案示意图

由于搬入时搬运的数据长度必须保证32字节对齐。数据长度非对齐的情况下,从Global逐行搬运Tensor数据到Local中,Local中每行都存在冗余数据。

搬入后,进行矢量计算时对冗余数据的处理方式有以下几种:
由于搬出时搬运的数据长度和操作数的起始地址(UB上)必须保证32字节对齐,搬出时可以选择去除冗余数据或者带着冗余数据搬出的方式。
下面分别对上述几种处理方案做详细说明。

样例介绍