cann/asc-devkit SIMD矩阵NZ2ND转换
# NZ2ND【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit特性说明矩阵搬出时NZ2ND功能即为实现NZ格式到ND格式的矩阵转换。NZ2ND转化过程可以参考以下伪代码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_SizeC0_Size16*sizeof(T)T为操作数的数据类型字节。dstNdStride表示不同目标ND矩阵之间的间隔单位为元素。特性约束当开启Channel Split/Channel Merge功能NZ2NZ时此功能不可用。目标操作数地址之间不能重叠。使用示例如下图所示在L0C Buffer中有两个NZ格式的矩阵每个矩阵N方向上维度为32M方向上维度为48经过NZ2ND转换将数据格式变为右部分所示排布。图1NZ2ND示意图对于该场景可以通过配置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本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考