当前位置: 首页 > news >正文

CANN/asc-devkit 切片数据搬运

切片数据搬运

【免费下载链接】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 推理产品

x

Atlas 推理系列产品 AI Core

Atlas 推理系列产品 Vector Core

x

Atlas 训练系列产品

x

功能说明

支持数据的切片搬运,提取多维Tensor数据的子集进行搬运。

函数原型

  • Global Memory -> Local Memory

    template <typename T> __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const SliceInfo dstSliceInfo[], const SliceInfo srcSliceInfo[], const uint32_t dimValue = 1)
  • Local Memory -> Global Memory

    template <typename T> __aicore__ inline void DataCopy(const GlobalTensor<T> &dst, const LocalTensor<T> &src, const SliceInfo dstSliceInfo[], const SliceInfo srcSliceInfo[], const uint32_t dimValue = 1)

[!NOTE]说明 各原型支持的具体数据通路和数据类型,请参考支持的通路和数据类型。

参数说明

表 1模板参数说明

参数名

描述

T

源操作数和目的操作数的数据类型。支持的数据类型请参考支持的通路和数据类型。

表 2切片数据搬运接口参数说明

参数名称

输入/输出

含义

dst

输出

目的操作数,类型为LocalTensor或GlobalTensor。

src

输入

源操作数,类型为LocalTensor或GlobalTensor。

srcSliceInfo/dstSliceInfo

输入

目的操作数/源操作数切片信息,SliceInfo类型。

具体定义请参考${INSTALL_DIR}/include/ascendc/basic_api/interface/kernel_struct_data_copy.h,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。

dimValue

输入

操作数维度信息,默认值为1。

表 3SliceInfo结构参数说明

参数名称

含义

startIndex

切片的起始元素位置。

endIndex

切片的终止元素位置。

stride

切片的间隔元素个数。

burstLen

横向切片,每一片数据的长度,仅在维度为1时生效,超出1维的情况下,必须配置为1,不支持配置成其他值。单位为datablock(32B)。比如,srcSliceInfo的List为 {{16, 70, 7, 3, 87}, {0, 2, 1, 1, 3}},{16, 70, 7, 3, 87}表示第一维的切片信息,burstLen设置为3,表示一个切片数据段大小为3个datablock; {0, 2, 1, 1, 3}为第二维的切片信息,burstLen仅能设置为1。

shapeValue

当前维度的原始长度。单位为元素个数。

通过具体的示例对上述参数进行解析,示意图如下:

图 1参数解析示意图
![](https://raw.gitcode.com/cann/asc-devkit/raw/68eb55191616e7a7b08961a5c82a706272353b5f/docs/api/figures/参数解析示意图.png "参数解析示意图"?utm_source=gitcode_repo_files)

  • dimValue为2,表示操作数有2维。

  • srcSliceInfo为 {{16, 70, 7, 3, 87}, {0, 2, 1, 1, 3}}

    • {16, 70, 7, 3, 87}是针对单独一行, 即从一维的角度来配置,每个元素代表一个数:

      startIndex= 16,表示有效数据段从第16个数开始;

      endIndex= 70,表示有效数据段到第70个数结束;

      stride= 7,单位为元素个数,表示相邻的2个切片数据段间隔的元素个数,为7个0的间距;

      burstLen= 3,单位为32B,表示在这一个有效数据段中,一个切片数据段大小为3个datablock;

      shapeValue= 87,表示单独一行的长度,单位为元素个数,即 8 * 10 + 7 = 87个元素。

    • {0, 2, 1, 1, 3}是针对多行,即从二维的角度来配置,每个元素代表一行:

      startIndex= 0,表示有效数据段从第0行开始;

      endIndex= 2,表示有效数据段到第2行结束;

      stride= 1,表示相邻的2个切片数据段中间隔元素为1行;

      burstLen= 1,在dimValue > 1时必须填为1;

      shapeValue= 3,表明一共有3行。

  • dstSliceInfo为{{0, 47, 0, 3, 48}, {0, 1, 0, 1, 2}}

    • {0, 47, 0, 3, 48}是针对单独一行, 即从一维的角度来配置,每个元素代表一个数:

      startIndex= 0,表示有效数据段从第0个数开始;

      endIndex= 47,表示有效数据段到第47个数结束;

      stride= 0,单位为元素个数,表示相邻的2个切片数据段间隔的元素个数,为0表示两个切片数据段没有间距;

      burstLen= 3,单位为32B,表示在这一个有效数据段中,一个切片数据段大小为3个datablock;

      shapeValue= 48,表示单独一行的长度,单位为元素个数,即8 * 6 = 48个元素。

    • {0, 1, 0, 1, 2} 是针对多行,即从二维的角度来配置,每个元素代表1行:

      **startIndex **= 0,表示有效数据段从第0行开始;

      **endIndex **= 1,表示有效数据段到第1行结束;

      **stride **= 0,表示相邻的2个切片数据段没有间隔;

      burstLen= 1,在dimValue > 1时必须填为1;

      **shapeValue **= 2,表示一共有2行。

返回值说明

约束说明

  • 切片数据搬运中的横向burstLen大小设置,需要用户自己通过计算:横向切片元素个数* sizeof(T)/32byte。横向切片元素个数* sizeof(T)的大小必须是32byte的倍数。
  • 切片数据搬运中的SliceInfo结构体数组大小和dimValue需要保持一致,并且不超过8。
  • 切片数据搬运中的srcSliceInfo数组大小的和dstSliceInfo的大小需要保持一致,两者的结构体中的burstLen需要相等(srcSliceInfo[i].burstLen = dstSliceInfo[i].burstLen)。
  • 切片数据搬运对参数有一定要求,建议使用者参考调用示例,并在CPU上仿真结果无误后,再到NPU侧执行。

支持的通路和数据类型

下文的数据通路均通过逻辑位置TPosition来表达,并注明了对应的物理通路。TPosition与物理内存的映射关系见表1。

表 4Global Memory -> Local Memory具体通路和支持的数据类型

产品型号

数据通路

源操作数和目的操作数的数据类型(两者保持一致)

Ascend 950PR/Ascend 950DT

GM -> VECIN(GM -> UB)

bool、int8_t、uint8_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、fp8_e8m0_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、complex32、int64_t、uint64_t、double、complex64

Atlas 推理系列产品 AI Core

GM -> VECIN(GM -> UB)

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、float

Atlas A2 训练系列产品 / Atlas A2 推理系列产品

GM -> VECIN(GM -> UB)

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float

Atlas A3 训练系列产品 / Atlas A3 推理系列产品

GM -> VECIN(GM -> UB)

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float

表 5Local Memory -> Global Memory具体通路和支持的数据类型

产品型号

数据通路

源操作数和目的操作数的数据类型(两者保持一致)

Ascend 950PR/Ascend 950DT

VECOUT -> GM(UB -> GM)

bool、int8_t、uint8_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、fp8_e8m0_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、complex32、int64_t、uint64_t、double、complex64

Atlas 推理系列产品 AI Core

VECOUT、CO2 -> GM(UB -> GM)

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、float

Atlas A2 训练系列产品 / Atlas A2 推理系列产品

VECOUT -> GM(UB -> GM)

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float

Atlas A3 训练系列产品 / Atlas A3 推理系列产品

VECOUT -> GM(UB -> GM)

int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float

调用示例

本示例仅展示样例中的部分代码。如需运行,请参考切片数据搬运样例实现完整的代码。srcSliceInfo、dstSliceInfo参数解析与结果示例请参考图1。

// srcLocal为float类型的LocalTensor,srcGlobal、dstGlobal为float类型的GlobalTensor uint32_t dimValue = 2; // 操作数维度为2 AscendC::SliceInfo srcSliceInfo[] = {{16, 70, 7, 3, 87}, {0, 2, 1, 1, 3}}; AscendC::SliceInfo dstSliceInfo[] = {{0, 47, 0, 3, 48}, {0, 1, 0, 1, 2}}; // Global Memory -> Local Memory AscendC::DataCopy(srcLocal, srcGlobal, dstSliceInfo, srcSliceInfo, dimValue); // Local Memory -> Global Memory AscendC::DataCopy(dstGlobal, srcLocal, dstSliceInfo, dstSliceInfo, dimValue);

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/851390/

相关文章:

  • CANN asnumpy快速开始指南
  • 暗黑破坏神2存档编辑器的5个核心问题与完美解决方案
  • 2026天津众包TOP5!天津东丽区天津滨海新区等地服务商合规高效获认可 - 十大品牌榜
  • CST优化器实战:手把手教你设定目标,自动找到让PCB辐射最低的最佳走线间隙
  • CANN / cannbot-skills:自定义算子入图
  • CANNBot MoE并行实施指南
  • 天津大学LaTeX论文模板终极指南:告别格式困扰,专注学术创作
  • PlatformIO国内安装避坑全记录:解决Python环境、pip换源与网络下载慢的问题
  • 作为一名测试工程师,你是否也经历过这些崩溃时刻?
  • 打破Mac与Windows的存储壁垒:Free-NTFS-for-Mac完整读写指南
  • C++私有成员访问的深度探索:从封装原理到模板技巧
  • 国产化工控主板选型实战:龙芯、飞腾、海光平台深度解析与避坑指南
  • LumenPnP开源贴片机:从DIY到小批量生产的完整技术方案
  • Jar Analyzer 字节码调试功能:类似OD/GDB的指令级GUI调试实现原理
  • CANN/asc-devkit TensorTrait样例
  • FreeRTOS队列机制深度解析:嵌入式实时系统任务通信的核心枢纽
  • CANN/ops-nn Swish激活函数
  • Perplexity医疗搜索效能跃迁(FDA黑框警告级误检率下降76%实测报告)
  • Windows 11性能监控终极指南:实时跟踪系统资源使用情况的完整教程
  • CANN/asc-devkit AllGather通信接口
  • AI招聘工具怎么选?直接推荐前程无忧的3个理由
  • elec-ops-simulation实战教程:5步实现电网稳态运行仿真
  • KDiff3文件比较与合并工具:从新手到高手的完整指南
  • 无王无帝定乾坤,来自田间第一人:凰标永存昭后世
  • 别再乱设时钟裕量了!手把手教你用set_clock_uncertainty搞定DC/PT时序收敛
  • 终极指南:如何使用Harepacker复活版轻松打造你的MapleStory游戏世界
  • 3DSident深度技术解析:逆向工程工具与硬件诊断套件的系统级实现
  • NS-USBLoader终极指南:一站式解决Switch玩家的三大痛点
  • Codex 安装与 VS Code 联动:手把手配置指南
  • 【HarmonyOS 6.1 全场景实战】《灵犀厨房》实战(十七):【语音识别】免提声控启动播报——动口不动手