多维数据搬运(ISASI)
产品支持情况
产品 |
是否支持 |
|---|---|
Atlas 350 加速卡 |
√ |
x |
|
x |
|
x |
|
x |
|
x |
|
x |
功能说明
多维数据搬运接口,相比于基础数据搬运接口,可更加自由配置搬入的维度信息以及对应的Stride。
函数原型
- Global Memory-> Local Memory ,支持多维度搬运
1 2
template <typename T, uint8_t dim, const NdDmaConfig& config = kDefaultNdDmaConfig> __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const NdDmaParams<T, dim>& params)
- NdDma DataCache刷新,在使用DataCopy接口进行数据搬运前,需要使用NdDmaDci接口刷新缓存保证DataCache为最新状态。
1__aicore__ inline void NdDmaDci()
参数说明
参数名 |
描述 |
||
|---|---|---|---|
T |
源操作数或者目的操作数的数据类型。 |
||
dim |
搬运的数据维度, 数据类型为uint8_t,支持的维度为[1, 5]。 |
||
config |
搬运配置选项,NdDmaConfig类型,定义如下,具体参数说明请参考表 NdDmaConfig结构体参数定义。
|
参数名称 |
输入/输出 |
含义 |
||||
|---|---|---|---|---|---|---|
dst |
输出 |
目的操作数,类型为LocalTensor。 |
||||
src |
输入 |
源操作数,类型为GlobalTensor。 |
||||
params |
输入 |
搬运参数 NdDmaParams类型,定义如下,具体参数说明请参考表 NdDmaParams结构体参数定义。
NdDmaLoopInfo类型,定义如下,具体参数说明请参考表 NdDmaLoopInfo结构体参数定义。
|
参数名称 |
含义 |
|---|---|
unsetPad |
表示不设置PaddingSize,固定为0xFFFF。 |
isNearestValueMode |
表示Padding值填取方式,类型为bool。 True:使能最近值填充方式,即左右Padding值会选取当前维度最左或最右的值进行填充,可参考图1。 False:使能常数填充方式,即所有Padding值填充为固定值NdDmaParams::constantValue。 当数据类型为b64时,参数isNearestValueMode的值应为False。 |
loopLpSize |
表示每个维度内的PaddingSize,当该值不为unsetPad时,则表示所有循环里的左PaddingSize为该值,且会使NdDmaLoopInfo::loopLpSize不生效。默认值为unsetPad,开发者可填的范围为默认值或[0,255]。 |
loopRpSize |
表示每个维度内的PaddingSize,当该值不为unsetPad时,则表示所有循环里的右PaddingSize为该值,且会使NdDmaLoopInfo::loopRpSize不生效。默认值为unsetPad,开发者可填的范围为默认值或[0,255]。 |
ascOptimize |
预留参数,暂不支持。 |
参数名称 |
含义 |
|---|---|
loopInfo |
每维进行搬运的信息,类型为NdDmaLoopInfo<dim>。 NdDmaLoopInfo结构中数组类型的参数,其数组索引值对应实际维度信息,索引0 - 4对应1 - 5维。具体参数介绍可参考表 NdDmaLoopInfo结构体参数定义。 |
constantValue |
数据类型为T的数值,当存在维度左右Padding,且不使能NearestValueMode时,该值将作为Padding值填充。 当数据类型为b64时,参数constantValue的值应为0。 |
参数名称 |
含义 |
|---|---|
loopSrcStride |
表示每个维度内,该源操作数元素与下一个元素间的间隔。 单位为元素个数。数据类型为uint64_t,srcStride需在[0, 240)。 |
loopDstStride |
表示每个维度内,该目的操作数元素与下一个元素间的间隔。 单位为元素个数。数据类型为uint32_t,dstStride需在[0, 220)。 |
loopSize |
表示每个维度内,处理的元素个数(不包含Padding元素)。 单位为元素个数。数据类型为uint32_t,dstStride需在[0, 220)。 |
loopLpSize |
表示每个维度内,左侧需要补齐的元素个数。 单位为元素个数。数据类型为uint8_t,srcStride不要超出该数据类型的取值范围。 |
loopRpSize |
表示每个维度内,右侧需要补齐的元素个数。 单位为元素个数。数据类型为uint8_t,srcStride不要超出该数据类型的取值范围。 |
以下以2维的例子介绍几个典型使用场景。



通路说明
支持型号 |
数据通路(通过TPosition表达) |
源操作数和目的操作数的数据类型 (两者保持一致) |
|---|---|---|
Atlas 350 加速卡 |
GM -> VECIN |
b8、b16、b32、b64 |
返回值说明
无
约束说明
- 一条指令所能获取的所有数据的地址范围宽度不能超过40位(1TB),即:
源操作数的每一次循环的大小为:(loopLpSize + loopSize + loopRpSize -1 ) * loopSrcSize,目的操作数的每一次循环的大小为:(loopLpSize + loopSize + loopRpSize -1 ) * loopDstSize,所有的循环的大小加起来不超过2的40次方位。
- 当每层循环的dstStride为升序序列,则不同循环间的地址空间不能交织或者重叠。以一个2D Padding场景为例,loopSrcStride、loopDstStride第二个维度的stride值最小是3,数据3不能落在维度1的循环中。
- 该接口通过NDDMA进行数据搬运,对应的NDDMA Cache大小为32KB,在使用DataCopy接口进行数据搬运前,需要使用NdDmaDci接口刷新缓存,否则多核场景下读写同一块GM地址可能会导致部分核读取数据错误。
调用示例
1 2 3 4 5 6 7 8 9 10 11 | // T:搬运数据的类型 // xGm:保存DataCopy搬入数据 // xLocal:保存DataCopy搬出数据 // 2D Padding场景 // xGmShape:[2, 8],搬运8列2行数据,左Padding 3,上Padding 1,右Padding 5,下Padding 1,xLocalShape:[4, 16] AscendC::NdDmaLoopInfo<2> loopInfo{{1, 8}, {1, 16}, {8, 2}, {3, 1}, {5, 1}}; AscendC::NdDmaParams<T, 2> params{loopInfo, 0}; // padding的值为0 AscendC::NdDmaDci(); // 刷新cache static constexpr AscendC::NdDmaConfig dmaConfig; // 使用默认参数,也可以不传 AscendC::DataCopy<T, 2, dmaConfig>(xLocal, xGm, params); |
输入数据(xGm): [[ 1. 2. 3. 4. 5. 6. 7. 8.] [ 9. 10. 11. 12. 13. 14. 15. 16.]] 搬运至Local的数据(xLocal): [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 0. 0. 1. 2. 3. 4. 5. 6. 7. 8. 0. 0. 0. 0. 0.] [ 0. 0. 0. 9. 10. 11. 12. 13. 14. 15. 16. 0. 0. 0. 0. 0.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

