Skip to content

NZ2ND

特性说明

矩阵搬出时,NZ2ND功能即为实现NZ格式到ND格式的矩阵转换。

NZ2ND转化过程可以参考以下伪代码:

C++
for (i = 0; i < ndNum; i++) {
    // fractal_size = 16 * sizeof(L0C_element)
    src_temp_nd_addr = src + srcNdStride * fractal_size * i;
    dst_temp_nd_addr = dst + dstNdStride * sizeof(dst_element) * i;
    for (j = 0; j < mSize; j++) {
        src_temp_n_addr = src_temp_nd_addr + j * 16 * sizeof(L0C_element);
        dst_temp_n_addr = dst_temp_nd_addr + j * dstStride * sizeof(dst_element);
        for (k = 0; k < ceil(nSize / 16); k++) {
            src_block_addr = src_temp_n_addr + k * srcStride * 16 * sizeof(L0C_element);
            dst_block_addr = dst_temp_n_addr + k * 16 * sizeof(dst_element);
        }
    }
}

伪代码使用的参数具体说明如下:

  • src表示源操作数搬运的起始地址。
  • dst表示目的操作数搬运的起始地址。
  • 源操作数每个NZ矩阵的起始地址为src_temp_nd_addr。
  • 目的操作数每个ND矩阵的起始地址为dst_temp_nd_addr。
  • 源操作数中每个NZ矩阵中每一行的起始地址为src_temp_n_addr。
  • 目的操作数每个ND矩阵中每一行的起始地址为dst_temp_n_addr。
  • 在每一行中,以16个数据为一个数据块,源操作数每块数据块的起始地址为src_block_addr,目的操作数中每一块数据块的起始地址为dst_block_addr。

以下参数为NZ2ND用户可配置参数,含义及取值范围参见Fixpipe搬运参数参数说明

  • mSize与nSize分别表示矩阵m方向和n方向上的维度。
  • srcStride表示NZ矩阵中不同Z分形列的间隔,单位为C0_Size。
  • dstStride表示目标ND矩阵中不同行的间隔,单位为元素。
  • ndNum表示需要做NZ2ND转化的矩阵个数。
  • srcNdStride表示不同NZ矩阵之间的间隔,单位为16*C0_Size(C0_Size=16*sizeof(T),T为操作数的数据类型)字节。
  • dstNdStride表示不同目标ND矩阵之间的间隔,单位为元素。

特性约束

  • 当开启Channel Split/Channel Merge功能(NZ2NZ)时,此功能不可用。
  • 目标操作数地址之间不能重叠。

使用示例

如下图所示,在L0C Buffer中有两个NZ格式的矩阵,每个矩阵N方向上维度为32,M方向上维度为48,经过NZ2ND转换,将数据格式变为右部分所示排布。

图1 NZ2ND示意图

对于该场景,可以通过配置intriParams结构体参数实现上图的效果:

  • ndNum = 2,表示需要做NZ2ND转化的矩阵个数为2。
  • nSize = 32,表示源NZ矩阵在N方向上的大小为32个元素。
  • mSize = 48,表示源NZ矩阵在M方向上的大小为48个元素。
  • srcStride = 64,表示源NZ矩阵中相邻Z排布的起始地址之间的间隔为64 * C0_Size(C0_Size = 16*sizeof(T),T为操作数的数据类型)字节。
  • dstStride = 64,表示目的ND矩阵每一行中的元素个数为64。
  • srcNdStride = 256,表示不同NZ矩阵起始地址之间的间隔为256 * C0_Size字节。
  • dstNdStride = 4096,表示目的相邻ND矩阵起始地址之间的偏移为4096个元素。

免责声明:本站内容由 asc-devkit 仓 master 分支自动编译生成,属于持续开发版本,可能存在缺陷,仅供预览与参考。如需稳定及商用资料,请查阅官方 昇腾社区