copy_gm_to_cbuf_multi_nd2nz
功能说明
从GM到L1数据加载期间的数据格式转换接口,支持ND->NZ、NHWC->NC1HWC0和NHWC->C1HWNC0的格式转换。支持类型={b8, b16, b32s }。当类型={b8, b16, b32s} ,c0_size is 32Bytes。如果搬运数据的最低维度未对齐到32字节(针对c0_size为32的情况),则会对其在L1中填充零值到32B。
存储在GM中的数据为ND格式(行主序存储),存储在L1中的数据为NZ格式(即大N小Z,块间按列优先顺序存储、块内按行优先存储)。该接口能够处理多个ND到NZ的转换。
for(i=0;i<nd_num;i++) { // every loop: n*d*32
src_nd_addr = Xn + SRC_nd_matrix_stride * i * sizeof(data_type);
dst_nd_addr = Xd + DST_nz_matrix_stride * i * sizeof(data_type);
for(j=0;j<n;j++) { // every loop d*32
src_n_addr = src_nd_addr + j * SRC_D * sizeof(data_type);
dst_n_addr = dst_nd_addr + j * DST_nz_n_stride * C0_Size;
for(k=0;k<ceil(d * sizeof(data_type)) / 32;k++) { // every loop: 32Byte
src_block_addr = src_n_addr + k * 32;
dst_block_addr = dst_n_addr + k * DST_nz_C0_stride * C0_Size;
}
}
}
接口原型
// 相同接口的不同原型区别在于源地址和目的地址的数据类型不同 void copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ bfloat16_t *dst, __gm__ bfloat16_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ half *dst, __gm__ half *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ int16_t *dst, __gm__ int16_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b16(__cbuf__ uint16_t *dst, __gm__ uint16_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ float *dst, __gm__ float *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ int32_t *dst, __gm__ int32_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b32s(__cbuf__ uint32_t *dst, __gm__ uint32_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b8(__cbuf__ int8_t *dst, __gm__ int8_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride); void copy_gm_to_cbuf_multi_nd2nz_b8(__cbuf__ uint8_t *dst, __gm__ uint8_t *src, uint8_t sid, uint16_t ndNum, uint16_t nValue, uint16_t dValue, uint16_t srcNdMatrixStride, uint16_t srcDValue, uint16_t dstNzC0Stride, uint16_t dstNzNStride, uint16_t dstNzMatrixStride);
参数说明
|
参数名 |
说明 |
取值范围 |
单位 |
|---|---|---|---|
|
dst |
目的地址,其是32B对齐的,目的数据是(d//c0)nc0形式,并且c0是32B。 |
/ |
/ |
|
src |
源数据地址,其是按单字节对齐的,src中的数据为二维连续数据。 |
/ |
/ |
|
sid |
用于SMMU TLB预取提示, 一般为0。 |
/ |
/ |
|
ndNum |
待搬运数据的nd块数量,图1 参数含义示意图中的ndNum为2。 |
[0 ,2^12-1] |
elem |
|
nValue |
数据块n方向长度,含义见图1 参数含义示意图中的N。 |
[0, 16384] |
elem |
|
dValue |
数据块d方向长度,含义见图1 参数含义示意图中的D。 |
[0, 65535] |
elem |
|
srcNdMatrixStride |
源数据块nd块之间的距离,含义见下图中的Src_nd_matrix_stride,第二个nd矩阵起始地址为:src+srcNdMatrixStride*sizeof(data_type)。 |
[0, 65535] |
elem |
|
srcDValue |
SRC_D值,用于指示源nd矩阵的d维大小,含义见图1 参数含义示意图中的src_D。 |
[1, 65535] |
elem |
|
dstNzC0Stride |
L1中nz上2个c0块之间的距离,见图1 参数含义示意图中的DST_nz_C0_stride。 |
[1, 16384] |
C0_size |
|
dstNzNStride |
L1中n维上2个c0块之间的距离,见图1 参数含义示意图中的DST_nz_n_stride。 |
[1, 16384] |
C0_size |
|
dstNzMatrixStride |
2个nd矩阵中2个NZ矩阵的距离,见图1 参数含义示意图中的DST_nz_matrix_stride。第2个nd矩阵的第1个NZ分形的地址是Xd + DST_nz_matrix_stride*sizeof(data_type)。 |
[1, 65535] |
elem |
注意:
- 当type={b8,b16,b32S},C0_size为32字节时,目标数据不得存在重叠。如果存在重叠,写入L1时硬件不会报告任何警告或错误,并且无法保证重叠数据的写入顺序。
- ndNum=0或nValue=0或dValue=0表示不执行,此接口将被视为 NOP(无操作接口),并会报告警告。
- copy_gm_to_cbuf_multi_nd2nz中的stride均指代上一个首地址到下一个首地址的距离。
流水类型
PIPE_MTE2
