多维数据搬运ISASI【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品 / Atlas A3 推理系列产品xAtlas A2 训练系列产品 / Atlas A2 推理系列产品xAtlas 200I/500 A2 推理产品xAtlas 推理系列产品 AI CorexAtlas 推理系列产品 Vector CorexAtlas 训练系列产品x功能说明多维数据搬运接口相比于基础数据搬运接口可更加自由配置搬入的维度信息以及对应的Stride。函数原型Global Memory- Local Memory 支持多维度搬运template typename T, uint8_t dim, const NdDmaConfig config kDefaultNdDmaConfig __aicore__ inline void DataCopy(const LocalTensorT dst, const GlobalTensorT src, const NdDmaParamsT, dim params)NdDma DataCache刷新在使用DataCopy接口进行数据搬运前需要使用NdDmaDci接口刷新缓存保证DataCache为最新状态。__aicore__ inline void NdDmaDci()参数说明表 1模板参数说明参数名描述T源操作数或者目的操作数的数据类型。dim搬运的数据维度, 数据类型为uint8_t支持的维度为[1, 5]。config搬运配置选项NdDmaConfig类型定义如下具体参数说明请参考表 NdDmaConfig结构体参数定义。struct NdDmaConfig { static constexpr uint16_t unsetPad 0xffff; bool isNearestValueMode false; uint16_t loopLpSize unsetPad; // Left padding size of all dimensions, must be less than 256. uint16_t loopRpSize unsetPad; // Right padding size of all dimensions, must be less than 256. bool ascOptimize false; // used for Ascend C optimization on special senario. };表 2参数说明参数名称输入/输出含义dst输出目的操作数类型为LocalTensor。src输入源操作数类型为GlobalTensor。params输入搬运参数 NdDmaParams类型定义如下具体参数说明请参考表 NdDmaParams结构体参数定义。template typename T, uint8_t dim struct NdDmaParams { NdDmaLoopInfodim loopInfo; T constantValue; // 若有左右Padding且不使能NearestValueMode时该值将作为Padding值填充。 };NdDmaLoopInfo类型定义如下具体参数说明请参考表 NdDmaLoopInfo结构体参数定义。template uint8_t dim struct NdDmaLoopInfo { uint64_t loopSrcStride[dim] {0}; // src stride info per loop. uint32_t loopDstStride[dim] {0}; // dst stride info per loop. uint32_t loopSize[dim] {0}; // Loop size per loop. uint8_t loopLpSize[dim] {0}; // Left padding size per loop. uint8_t loopRpSize[dim] {0}; // Right padding size per loop. }; // 注意: dim的有效范围为[1,5]表 3NdDmaConfig结构体参数定义参数名称含义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预留参数暂不支持。表 4NdDmaParams结构体参数定义参数名称含义loopInfo每维进行搬运的信息类型为NdDmaLoopInfodim。NdDmaLoopInfo结构中数组类型的参数其数组索引值对应实际维度信息索引0 - 4对应1 - 5维。具体参数介绍可参考表 NdDmaLoopInfo结构体参数定义。constantValue数据类型为T的数值当存在维度左右Padding且不使能NearestValueMode时该值将作为Padding值填充。当数据类型为b64时参数constantValue的值应为0。表 5NdDmaLoopInfo结构体参数定义参数名称含义loopSrcStride表示每个维度内该源操作数元素与下一个元素间的间隔。单位为元素个数。数据类型为uint64_tsrcStride需在[0, 240)。loopDstStride表示每个维度内该目的操作数元素与下一个元素间的间隔。单位为元素个数。数据类型为uint32_tdstStride需在[0, 220)。loopSize表示每个维度内处理的元素个数不包含Padding元素。单位为元素个数。数据类型为uint32_tdstStride需在[0, 220)。loopLpSize表示每个维度内左侧需要补齐的元素个数。单位为元素个数。数据类型为uint8_tsrcStride不要超出该数据类型的取值范围。loopRpSize表示每个维度内右侧需要补齐的元素个数。单位为元素个数。数据类型为uint8_tsrcStride不要超出该数据类型的取值范围。以下以2维的例子介绍几个典型使用场景。图 12D Padding场景![](https://gitcode.com/cann/asc-devkit/blob/68eb55191616e7a7b08961a5c82a706272353b5f/docs/api/figures/2D-Padding场景.png 2D-Padding场景?utm_sourcegitcode_repo_files)图 22D Transpose场景![](https://raw.gitcode.com/cann/asc-devkit/raw/68eb55191616e7a7b08961a5c82a706272353b5f/docs/api/figures/2D-Transpose场景.png 2D-Transpose场景?utm_sourcegitcode_repo_files)图 32D BroadCast场景![](https://raw.gitcode.com/cann/asc-devkit/raw/68eb55191616e7a7b08961a5c82a706272353b5f/docs/api/figures/2D-BroadCast场景.png 2D-BroadCast场景?utm_sourcegitcode_repo_files)图 42D Slice场景![](https://raw.gitcode.com/cann/asc-devkit/raw/68eb55191616e7a7b08961a5c82a706272353b5f/docs/api/figures/2D-Slice场景.png 2D-Slice场景?utm_sourcegitcode_repo_files)通路说明表 6数据通路和数据类型支持型号数据通路通过TPosition表达源操作数和目的操作数的数据类型 (两者保持一致)Ascend 950PR/Ascend 950DTGM - VECINb8、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地址可能会导致部分核读取数据错误。调用示例完整算子样例参考多维数据搬运样例。// T搬运数据的类型 // xGm保存DataCopy搬入数据 // xLocal保存DataCopy搬出数据 // 2D Padding场景 // xGmShape[2, 8]搬运8列2行数据左Padding 3上Padding 1右Padding 5下Padding 1xLocalShape[4, 16] AscendC::NdDmaLoopInfo2 loopInfo{{1, 8}, {1, 16}, {8, 2}, {3, 1}, {5, 1}}; AscendC::NdDmaParamsT, 2 params{loopInfo, 0}; // padding的值为0 AscendC::NdDmaDci(); // 刷新cache static constexpr AscendC::NdDmaConfig dmaConfig; // 使用默认参数也可以不传 AscendC::DataCopyT, 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.]]【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考