cann/asc-devkit NZ2NZ矩阵搬出特性说明
NZ2NZ【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit特性说明矩阵计算的搬出过程中NZ2NZ的核心功能体现为矩阵计算结果搬出前后保持NZ数据排布不变。以如下产品型号为例Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品NZ2NZ转化过程可以参考以下伪代码for (j 0; j mSize; j) { src_temp_n_addr src j * sizeof(L0C_element) * 16; dst_temp_n_addr dst j * 16 * sizeof(DST_element); for (k 0; k ceil(nSize / 16); k) { src_block_addr src_temp_n_addr k * srcStride * sizeof(L0C_element) * 16; dst_block_addr dst_temp_n_addr k * dstStride * 32; } }伪代码使用的参数具体说明如下src表示源操作数搬运的起始地址。dst表示目的操作数搬运的起始地址。源操作数中NZ矩阵每一行的起始地址为src_temp_n_addr。目的操作数中NZ矩阵每一行的起始地址为dst_temp_n_addr。在每一行中以16个数据为粒度进行数据块切分源操作数每一块数据块的起始地址为src_block_addr目的操作数中每一数据块起始地址为dst_block_addr。以下参数为NZ2NZ用户可配置参数含义及取值范围参见Fixpipe搬运参数mSize与nSize分别表示矩阵M方向和N方向上的维度。srcStride表示源NZ矩阵中不同Z分形列的间隔单位为C0_SizeC0_Size16*sizeof(T)T为操作数的数据类型。dstStride表示目标NZ矩阵中不同Z分形列的间隔单位为32字节。以Ascend 950PR/Ascend 950DT为例NZ2NZ转化过程可以参考以下伪代码for (j 0; j mSize; j) { src_temp_n_addr src j * sizeof(L0C_element) * 16; dst_temp_n_addr dst j * 16 * sizeof(DST_element); for (k 0; k ceil(nSize / 16); k) { src_block_addr src_temp_n_addr k * srcStride * sizeof(L0C_element) * 16; dst_block_addr dst_temp_n_addr k * dstStride * sizeof(DST_element); } }伪代码使用的参数具体说明如下src表示源操作数搬运的起始地址。dst表示目的操作数搬运的起始地址。源操作数中NZ矩阵每一行的起始地址为src_temp_n_addr。目的操作数中NZ矩阵每一行的起始地址为dst_temp_n_addr。在每一行中以16个数据为粒度进行数据块切分源操作数每一块数据块的起始地址为src_block_addr目的操作数中每一数据块起始地址为dst_block_addr。以下参数为NZ2NZ用户可配置参数含义及取值范围参见Fixpipe搬运参数mSize与nSize分别表示矩阵M方向和N方向上的维度。srcStride表示源NZ矩阵中不同Z分形列的间隔单位为C0_SizeC0_Size16*sizeof(T)T为操作数的数据类型。dstStride表示目标NZ矩阵中不同Z分形列的间隔单位为element。特性约束当NZ2NZ与F32 Channel Split特性组合开启时搬出到GM的NZ分形中的小分形维度为16*8确保小z分形的大小为512B。对于B8数据类型NZ输出时Channel Merge默认开启搬出GM/L1 Buffer小分形维度为16*32确保小z分形的大小为512B。对于B4数据类型NZ输出时Channel Merge默认开启搬出GM/L1 Buffer小分形维度为16*64确保小z分形的大小为512B。目标操作数地址之间不能重叠。使用示例如下图所示在L0C Buffer中有一个NZ格式的矩阵该矩阵N方向上维度为48M方向上维度为24经过NZ2NZ转换将数据格式变为右部分所示排布。图1NZ2NZ示意图NPU架构版本2201示意图中参数设置示例通过Fixpipe接口搬运并去除dummy数据和解释说明如下当M方向上的数据元素个数不是16的倍数时搬入时会额外读取dummy数据并在写入目标位置后丢弃这些dummy数据。矩阵块被定义为连续的16*16的数据块数据块的个数为M/16向上取整矩阵块的长度为M*16*sizeof(T)T是数据类型。nSize48表示源NZ矩阵中待搬运矩阵在N方向上的大小为48个元素。mSize24表示源NZ矩阵中待搬运矩阵在M方向上的大小为24个元素。srcStride64表示源NZ矩阵中待搬运矩阵相邻Z排布的起始地址偏移即下图中第一个Z排布的起始地址与第二个Z排布的起始地址之间的间隔为64 * C0_Size。dstStride 40表示目的NZ矩阵中相邻Z排布的起始地址偏移即下图中第一个Z排布的起始地址与第二个Z排布的起始地址之间的间隔为40*32字节。图2NZ2NZ示意图NPU架构版本3510示意图中参数设置示例通过Fixpipe接口搬运并去除dummy数据和解释说明如下当M方向上的数据元素个数不是16的倍数时搬入时会额外读取dummy数据并在写入目标位置后丢弃这些dummy数据。矩阵块被定义为连续的16*16的数据块数据块的个数为M/16向上取整矩阵块的长度为M*16*sizeof(T)T是数据类型。nSize48表示源NZ矩阵中待搬运矩阵在N方向上的大小为48个元素。mSize24表示源NZ矩阵中待搬运矩阵在M方向上的大小为24个元素。srcStride64表示源NZ矩阵中待搬运矩阵相邻Z排布的起始地址偏移即下图中第一个Z排布的起始地址与第二个Z排布的起始地址之间的间隔为64 * C0_Size。dstStride 40 * 16表示目的NZ矩阵中相邻Z排布的起始地址偏移即下图中第一个Z排布的起始地址与第二个Z排布的起始地址之间的间隔为40*16个元素。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考