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

CANN/asc-devkit Add算子快速入门

Add算子快速入门

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

本示例为入门级演示,基于Ascend C SIMD实现Add算子,引导您快速完成实践,内容涵盖Device端核函数实现、Host端调用以及编译运行的完整流程,助您建立整体认知。开始前,请参考环境准备安装所需的CANN软件包。

以下分别介绍基于C语言API和C++ Tensor的两种典型实现方式。

  • Add算子功能介绍

    Add算子的数学表达式为:

    计算逻辑为逐元素完成z = x + y

  • Device端代码实现

    后缀名为*.asc的代码文件可同时包含Host端与Device端代码,Device端部分示例如下:

    • 基于C语言API实现Memory矢量计算示例

      __vector__ __global__ void add_custom(__gm__ float* x, __gm__ float* y, __gm__ float* z) { asc_init(); constexpr uint32_t block_length = TOTAL_LENGTH / NUM_BLOCKS; __gm__ float* x_gm = x + block_idx * block_length; __gm__ float* y_gm = y + block_idx * block_length; __gm__ float* z_gm = z + block_idx * block_length; __ubuf__ float x_local[block_length]; __ubuf__ float y_local[block_length]; __ubuf__ float z_local[block_length]; asc_copy_gm2ub((__ubuf__ void*)x_local, (__gm__ void*)x_gm, block_length * sizeof(float)); asc_copy_gm2ub((__ubuf__ void*)y_local, (__gm__ void*)y_gm, block_length * sizeof(float)); asc_sync(); asc_add(z_local, x_local, y_local, block_length); asc_sync(); asc_copy_ub2gm((__gm__ void*)z_gm, (__ubuf__ void*)z_local, block_length * sizeof(float)); asc_sync(); }

      [!NOTE] 说明

      • 本Memory矢量计算示例支持以下型号:
        • Atlas A3训练系列产品/Atlas A3推理系列产品
        • Atlas A2训练系列产品/Atlas A2推理系列产品
      • SIMD算子的Kernel函数需要额外修饰符,__vector__修饰符表明该算子仅在向量计算单元上执行。
    • 基于C++ Tensor实现Memory矢量计算示例

      template <uint32_t blockLength> __vector__ __global__ void add_custom(__gm__ float* x, __gm__ float* y, __gm__ float* z) { AscendC::InitSocState(); AscendC::GlobalTensor<float> xGm, yGm, zGm; xGm.SetGlobalBuffer(x + block_idx * blockLength, blockLength); yGm.SetGlobalBuffer(y + block_idx * blockLength, blockLength); zGm.SetGlobalBuffer(z + block_idx * blockLength, blockLength); AscendC::LocalMemAllocator<AscendC::Hardware::UB> ubAllocator; AscendC::LocalTensor<float> xLocal = ubAllocator.Alloc<float, blockLength>(); AscendC::LocalTensor<float> yLocal = ubAllocator.Alloc<float, blockLength>(); AscendC::LocalTensor<float> zLocal = ubAllocator.Alloc<float, blockLength>(); AscendC::DataCopy(xLocal, xGm, blockLength); AscendC::DataCopy(yLocal, yGm, blockLength); AscendC::PipeBarrier<PIPE_ALL>(); AscendC::Add(zLocal, xLocal, yLocal, blockLength); AscendC::PipeBarrier<PIPE_ALL>(); AscendC::DataCopy(zGm, zLocal, blockLength); AscendC::PipeBarrier<PIPE_ALL>(); }

      [!NOTE] 说明

      • 该样例支持以下型号:
        • Ascend 950PR/Ascend 950DT
        • Atlas A3训练系列产品/Atlas A3推理系列产品
        • Atlas A2训练系列产品/Atlas A2推理系列产品
      • SIMD算子的Kernel函数需要额外修饰符,__vector__修饰符表明该算子仅在向量计算单元上执行。
  • Host端代码实现

    Host端通过<<<>>>语法糖调用Device端核函数,示例代码如下:

    int32_t main(int argc, char const *argv[]) { ... constexpr uint32_t numBlocks = 8; ... // Launch kernel <<<NumBlocks, Block, Dynamic memory, Stream>>> // numBlocks : Number of Blocks // 0 : No dynamic memory required in this sample // nullptr : Use default stream // Example One:Call add kernel which is implemented by SIMD C API add_custom<<<numBlocks, 0>>>(xDevice, yDevice, zDevice); // Example Two:Call add kernel which is implemented by SIMD C++ Basic API // add_custom<blockLength><<<numBlocks, 0, stream>>>(xDevice, yDevice, zDevice); aclrtSynchronizeDevice(); ... }
  • 算子编译与运行

    CMake配置文件示例:

    cmake_minimum_required(VERSION 3.16) find_package(ASC REQUIRED) project(kernel_samples LANGUAGES ASC CXX) add_executable(c_api_add_example c_api_add.asc ) # ====================================================================================== # NPU 编译选项配置 # # 说明: # - 需根据实际部署的 NPU 硬件架构选择对应的 `npu-arch` 参数。 # ====================================================================================== target_compile_options(c_api_add_example PRIVATE $<$<COMPILE_LANGUAGE:ASC>:--npu-arch=dav-2201> )

    编译与执行示例:

    mkdir -p build && cd build; # 创建并进入build目录 cmake ..;make -j; # 编译工程 ./c_api_add_example # 运行样例

    [!NOTE] 说明

    • 编译选项--npu-arch用于指定NPU架构版本,dav-后面的数字为架构版本号,请替换为您实际使用的版本。各AI处理器型号与架构版本的对应关系请查阅AI处理器型号和 __NPU_ARCH__ 的对应关系。

此外,基于C/C++不同层级的编程接口和不同的矢量计算类型,Add算子有多种实现方式,具体可参考下表:

API层级矢量计算类型Add算子实例说明
SIMD C API基于指针的Memory矢量计算Memory矢量计算Add算子示例(同上述C API实现样例)贴合C语言开发习惯,易于上手
SIMD C API基于指针和Reg计算的Reg矢量计算Reg矢量计算Add算子示例贴合C语言开发习惯,性能上限更高
基础API基于Tensor的Memory矢量计算Memory矢量计算Add算子示例(同上述C++ Tensor实现样例)匹配Tensor编程习惯,易于上手
基础API基于Tensor的Reg矢量计算Reg矢量计算Add算子示例匹配Tensor编程习惯,性能上限更高

[!NOTE] 说明 Ascend 950PR/Ascend 950DT新一代架构在传统UB缓存体系的基础上,开放了寄存器(Register)可编程能力,单个寄存器大小为256B。基于寄存器的矢量计算称为Reg矢量计算,而基于传统UB的矢量计算称为Memory矢量计算。

若要深入理解Ascend C的SIMD与SIMT编程模型,请参阅Ascend C编程模型概述。

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

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

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

相关文章:

  • 2026软考|十大管理超全通俗笔记,备考闭眼记!
  • Gemini第三方嵌入组件合规黑洞(Cloudflare、Segment、Hotjar等11个SDK实测风险报告)
  • 2026年适合商旅两用的轻奢行李箱推荐:兼具商务感与生活品味的低调极简之选
  • 2026下半年长沙儿童摄影儿童照工作室优选与避坑精选指南 - charlieruizvin
  • 最新工厂物业洗地机品牌深度解析:优劣对比适配多元需求 - 资讯速览
  • 金价990元震荡 回收差价最高50元每克 广州卖金首选福运来 - 黄金回收
  • 2026成都实体AI获客破局,GEO精细化优化抢占同城AI自然流量 - 品牌洞察官
  • 【DeepSeek事实准确性测试权威报告】:2024年7大维度实测数据揭穿幻觉率真相
  • 打造半导体产线“数字安全屏障”:极光私有化方案护航高端制造
  • 少儿古诗系列 - 全网最美
  • 2026年黄金回收避坑指南 在长沙为何懂行人首选福运来 - 黄金回收
  • BarrageGrab:重塑直播数据采集的技术范式
  • 西安厨电/卫浴/家电批发哪里找?这家“一套也按批发价”的折扣仓值得关注 - 深度智识库
  • 如何为OpenClaw配置Taotoken作为其模型供应商
  • 亲测东莞GEO服务商哪家口碑最佳,我总结了这些经验 - 资讯速览
  • Agent应用实践之五 - 基础:AgentScope-模型集成
  • tg-boot架构特点
  • 【DeepSeek微服务架构黄金准则】:20年架构师亲授5大避坑指南与3套可落地演进路径
  • 2026 北京朝阳区装修公司十强推荐|狠人榜单:弱鸡直接淘汰,能打的只剩这 10 家 - 品牌优企推荐
  • 如何彻底解决MASA模组语言障碍:面向中文玩家的终极汉化指南
  • 沃尔玛购物卡回收哪个平台省心?这两个头部平台值得收藏 - 京回收小程序
  • 亲测在东莞找GEO服务商,选哪家服务更靠谱? - 资讯速览
  • Bilibili-Evolved快捷键终极指南:如何自定义键盘操作提升B站体验
  • Alcatel Lucent 8DG59945AA传输板
  • 2026宜昌新能源汽车店推荐榜:零跑最靠谱 - 资讯速览
  • 如果我想入职Tesla
  • 【2024多模态模型选型终极决策图谱】:DeepSeek VL vs Qwen-VL vs InternVL——吞吐/精度/显存/开源协议四维硬刚实测
  • 如何在5分钟内掌握SPT-AKI存档编辑器:离线版塔科夫存档修改终极指南
  • Beyond Compare 5激活密钥生成器:3种简单方法获取永久授权
  • 简单到离谱!OpenClaw 本地部署,不用命令行,双击就搞定