进行数据搬运和Vector计算时,对于搬运的数据长度和操作数的起始地址有如下的对齐要求:
下文描述中的Global代指Global Memory,Local代指Local Memory。
下面是一些非对齐搬运和计算的例子。
DataCopyPad接口提供非对齐搬运的功能,如果基于该接口支持的产品开发算子(参见支持的型号),则可以直接使用该接口解决非对齐场景下的搬运问题。但部分型号不支持DataCopyPad接口,则需要参考如下的方案处理。
如下图所示,将前11个half数据进行Abs计算,冗余数据可以参与计算,不影响最终结果,该种方式主要用于elemwise计算,这里步骤为:
如下图所示,假设输入数据的Shape为16*4,将输入数据搬入到UB后每行数据前4个half数据为有效数据,其余为冗余数据。为只对前4个half数据进行ReduceMin计算,且保证冗余数据不参与到计算,可以通过设置ReduceMin API的mask参数的方法掩盖掉脏数据。这里步骤为:
如下图所示,对于搬入后的非对齐数据,逐行进行Duplicate清零处理,步骤为:
uint64_t mask0 = ((uint64_t)1 << 16) - ((uint64_t)1 << 11); uint64_t mask[2] = {mask0, 0};
如下图所示,将Local内16*16大小的数据块进行脏数据清零,逐行清零性能会很差,可以使用Pad一次性清零,步骤为:
如下图所示,Local内存为16*16, 需要将16*6的有效内存搬到Global中,步骤如下:
如下图所示,为搬出19个half数据到Global中,使用GatherMask处理,步骤如下: