CANN/asc-devkit: GMToUB多维数据搬运NDDMA

发布时间:2026/7/16 11:31:34
CANN/asc-devkit: GMToUB多维数据搬运NDDMA GMToUB多维数据搬运NDDMA(DataCopy)【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit产品支持情况Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品不支持Atlas A2 训练系列产品/Atlas A2 推理系列产品不支持Atlas 200I/500 A2 推理产品不支持Atlas 推理系列产品AI Core不支持Atlas 推理系列产品Vector Core不支持Atlas 训练系列产品不支持功能说明头文件路径为basic_api/kernel_operator_data_copy_intf.h。多维数据搬运接口相比于基础数据搬运接口可更加自由配置搬入的维度信息以及对应的Stride。具体支持的数据通路为以逻辑位置TPosition表示Global Memory - Unified BufferGM - VECIN函数原型Global Memory - Unified Buffer支持多维度搬运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 Cache刷新在使用DataCopy接口进行数据搬运前需要使用NdDmaDci接口刷新NDDMA Cache缓存保证为最新状态。__aicore__ inline void NdDmaDci()参数说明表1模板参数说明参数名描述T源操作数或者目的操作数的数据类型。dim搬运的数据维度数据类型为uint8_t支持的维度为[1, 5]。config搬运配置选项NdDmaConfig类型定义如下具体参数说明请参考表3。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 scenario.};表2参数说明参数名输入/输出描述dst输出目的操作数类型为LocalTensor。src输入源操作数类型为GlobalTensor。params输入搬运参数NdDmaParams类型定义如下具体参数说明请参考表4。template typename T, uint8_t dimstruct NdDmaParams {NdDmaLoopInfodim loopInfo;T constantValue; // 若有左右Padding且不使能NearestValueMode时该值将作为Padding值填充。};NdDmaLoopInfo类型定义如下具体参数说明请参考表5。template uint8_t dimstruct 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维。具体参数介绍可参考表5。constantValue数据类型为T的数值当存在维度左右Padding且不使能NearestValueMode时该值将作为Padding值填充。当数据类型为b64时参数constantValue的值应为0。表5NdDmaLoopInfo结构体参数定义参数名描述loopSrcStride表示每个维度内该源操作数元素与下一个元素间的间隔。单位为元素个数。数据类型为uint64_tloopSrcStride需在[0, 240)。loopDstStride表示每个维度内该目的操作数元素与下一个元素间的间隔。单位为元素个数。数据类型为uint32_tloopDstStride需在[0, 220)。loopSize表示每个维度内处理的元素个数不包含Padding元素。单位为元素个数。数据类型为uint32_tloopSize需在[0, 220)。loopLpSize表示每个维度内左侧需要补齐的元素个数。单位为元素个数。数据类型为uint8_tloopLpSize不要超出该数据类型的取值范围[0, 255]。loopRpSize表示每个维度内右侧需要补齐的元素个数。单位为元素个数。数据类型为uint8_tloopRpSize不要超出该数据类型的取值范围[0, 255]。以下以2维的例子介绍几个典型使用场景。图12D Padding场景![](https://raw.gitcode.com/cann/asc-devkit/raw/8b3a8bad8ad133904fcd749f036a531477beb543/docs/zh/api/figures/2d_padding_scenario.png 2D-Padding场景?utm_sourcegitcode_repo_files)图22D Transpose场景![](https://raw.gitcode.com/cann/asc-devkit/raw/8b3a8bad8ad133904fcd749f036a531477beb543/docs/zh/api/figures/2d_transpose_scenario.png 2D-Transpose场景?utm_sourcegitcode_repo_files)图32D BroadCast场景![](https://raw.gitcode.com/cann/asc-devkit/raw/8b3a8bad8ad133904fcd749f036a531477beb543/docs/zh/api/figures/2d_broadcast_scenario.png 2D-BroadCast场景?utm_sourcegitcode_repo_files)图42D Slice场景![](https://raw.gitcode.com/cann/asc-devkit/raw/8b3a8bad8ad133904fcd749f036a531477beb543/docs/zh/api/figures/2d_slice_scenario.png 2D-Slice场景?utm_sourcegitcode_repo_files)数据类型源操作数和目的操作数支持的数据类型保持一致。Ascend 950PR/Ascend 950DT支持的数据类型为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接口刷新缓存否则多核场景下读写同一块Global Memory地址可能会导致部分核读取数据错误。调用示例场景12D Padding场景常数填充方式// xGmShape[16, 32]搬运8列2行数据左Padding 15上Padding 13右Padding 17下Padding 3xLocalShape[32, 64]。 AscendC::NdDmaLoopInfo2 loopInfo{{1, 32}, {1, 64}, {32, 16}, {15, 13}, {17, 3}}; AscendC::NdDmaParamsT, 2 params{loopInfo, 0}; // padding的值为0 AscendC::NdDmaDci(); // 刷新cache static constexpr AscendC::NdDmaConfig dmaConfig; // 使用默认参数也可以不传。 AscendC::DataCopyT, 2, dmaConfig(xLocal, xGm, params);场景22D Padding场景最近值填充方式// xGmShape[28, 15]搬运3列4行数据左Padding 11上Padding 3右Padding 6下Padding 1xLocalShape[32, 32]。 AscendC::NdDmaLoopInfo2 loopInfo{{1, 15}, {1, 32}, {15, 28}, {11, 3}, {6, 1}}; AscendC::NdDmaParamsT, 2 params{loopInfo, 0}; AscendC::NdDmaDci(); // 刷新cache // isNearestValueMode true左右Padding值会选取当前维度最左或最右的值进行填充。 static constexpr AscendC::NdDmaConfig dmaConfig {true}; AscendC::DataCopyT, 2, dmaConfig(xLocal, xGm, params);场景32D Transpose场景// xGmShape[16, 64]搬运8列4行数据xLocalShape[64, 16]。 AscendC::NdDmaLoopInfo2 loopInfo{{1, 64}, {16, 1}, {64, 16}, {0, 0}, {0, 0}}; AscendC::NdDmaParamsT, 2 params{loopInfo, 0}; AscendC::NdDmaDci(); // 刷新cache static constexpr AscendC::NdDmaConfig dmaConfig; // 使用默认参数也可以不传。 AscendC::DataCopyT, 2, dmaConfig(xLocal, xGm, params);场景42D BroadCast场景// xGmShape[1, 16]搬运16列1行数据并进行广播xLocalShape[3, 16]。 AscendC::NdDmaLoopInfo2 loopInfo{{1, 0}, {1, 16}, {16, 3}, {0, 0}, {0, 0}}; AscendC::NdDmaParamsT, 2 params{loopInfo, 0}; AscendC::NdDmaDci(); // 刷新cache static constexpr AscendC::NdDmaConfig dmaConfig; // 使用默认参数也可以不传。 AscendC::DataCopyT, 2, dmaConfig(xLocal, xGm, params);场景52D Slice场景// xGmShape[32, 64]将16*10的矩阵截取为一个5*7的矩阵xLocalShape[16, 16]。 AscendC::NdDmaLoopInfo2 loopInfo{{1, 64}, {1, 16}, {16, 16}, {0, 0}, {0, 0}}; AscendC::NdDmaParamsT, 2 params{loopInfo, 0}; AscendC::NdDmaDci(); // 刷新cache static constexpr AscendC::NdDmaConfig dmaConfig; // 使用默认参数也可以不传。 AscendC::DataCopyT, 2, dmaConfig(xLocal, xGm, params);完整样例请参考多维数据搬运样例。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考