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

CANN-Ascend-C入门-昇腾NPU上写第一个自定义算子

CANN-Ascend-C入门-昇腾NPU上写第一个自定义算子

Ascend C 是昇腾NPU的算子开发语言,语法类似 CUDA C。如果你有 GPU 算子开发经验,迁移成本约 2-3 天。这篇从零写一个向量加法算子,走通编译、注册、调用的全流程。

环境准备

# CANN 开发环境exportASCEND_HOME_PATH=/usr/local/Ascend/ascend-toolkit/latest# 验证编译器可用whichascendc# 应该输出 ascendc 的路径

第一步:写 Kernel

// add_custom_kernel.cpp#include"kernel_operator.h"classAddCustomKernel{public:__aicore__inlinevoidInit(GM_ADDR x,GM_ADDR y,GM_ADDR z,uint32_ttotal_len){// 昇腾NPU的全局内存映射x_gm_.SetGlobalBuffer((__gm__ half*)x,total_len);y_gm_.SetGlobalBuffer((__gm__ half*)y,total_len);z_gm_.SetGlobalBuffer((__gm__ half*)z,total_len);// 计算分块参数:每个 Vector 单元处理 256 个元素// 这样 32 个 Vector 单元可以并行处理 8192 个元素block_len_=256;tiles_=(total_len+block_len_-1)/block_len_;}__aicore__inlinevoidProcess(){for(int32_ti=0;i<tiles_;i++){// 1. 从 HBM 读入数据到 Vector 本地缓存LocalTensor<half>x_local=x_buf_.Get<half>();LocalTensor<half>y_local=y_buf_.Get<half>();LocalTensor<half>z_local=z_buf_.Get<half>();DataCopy(x_local,x_gm_[i*block_len_],block_len_);DataCopy(y_local,y_gm_[i*block_len_],block_len_);// 2. Vector 单元做加法Add(z_local,x_local,y_local,block_len_);// 3. 写回 HBMDataCopy(z_gm_[i*block_len_],z_local,block_len_);}}private:TPipe pipe_;TBuf<QuePosition::VECCALC>x_buf_,y_buf_,z_buf_;GlobalTensor<half>x_gm_,y_gm_,z_gm_;uint32_tblock_len_;uint32_ttiles_;};// 算子入口函数(必须用这个签名)extern"C"__global__voidadd_custom_kernel(GM_ADDR x,GM_ADDR y,GM_ADDR z,GM_ADDR workspace,GM_ADDR tiling){// 从 Tiling 数据获取元素总数uint32_ttotal_len=*reinterpret_cast<uint32_t*>(tiling);AddCustomKernel op;op.Init(x,y,z,total_len);op.Process();}

几个关键概念:

  • __aicore__:函数跑在 AI Core 上,不是 CPU
  • GM_ADDR:HBM 全局内存地址
  • LocalTensor:Vector 单元的片上缓存
  • DataCopy:DMA 数据搬运
  • Add:Vector 单元的向量加法

第二步:写 Tiling 函数

// add_custom_tiling.cpp#include"op_host.h"ge::graphStatusAddCustomTiling(constge::Operator&op,TilingContext*ctx){autox_shape=ctx->GetInputShape(0);uint32_ttotal_len=x_shape.GetShapeSize();ctx->SetTilingData("total_len",total_len);returnge::GRAPH_SUCCESS;}

这个例子不需要复杂的分块策略——只是传递元素总数。复杂算子的 Tiling 需要根据输入 shape 计算 Cube 单元的分块大小。

第三步:注册算子

// add_custom.cpp#include"op_host.h"namespacege{IMPL_OP(AddCustom).Inputs({"x","y"}).Outputs({"z"}).Tiling(AddCustomTiling);}

第四步:编译

# 编译 kernelascendc--chip=Ascend910B2 add_custom_kernel.cpp-obuild/# 编译 host 代码g++-shared-fPICadd_custom.cpp add_custom_tiling.cpp\-I${ASCEND_HOME_PATH}/include\-L${ASCEND_HOME_PATH}/lib64-lopapi\-obuild/libadd_custom.so

第五步:在 PyTorch 中调用

importtorchimporttorch_npu# 手动调用自定义算子x=torch.randn(1024,device="npu",dtype=torch.float16)y=torch.randn(1024,device="npu",dtype=torch.float16)z=torch_npu.npu.add_custom(x,y)# 验证结果expected=x+yasserttorch.allclose(z,expected,atol=1e-3)

和 CUDA C 的差异

概念CUDA CAscend C
入口函数__global__ void kernel(...)extern "C" __global__ void kernel(...)
线程索引threadIdx.x无直接等价(用 tile 循环)
共享内存__shared__LocalTensor
全局内存指针GM_ADDR+SetGlobalBuffer
同步__syncthreads()pipe_barrier()
计算单元CUDA CoreCube (MatMul) + Vector (逐元素)

最大差异:CUDA 是 SIMT 模型(每线程独立执行),Ascend C 是 SIMD 模型(一个指令处理一批数据)。迁移时需要把线程级的逻辑改写为向量级的操作。


第一个 Ascend C 算子最难的是理解存储层次——HBM、L2、L1、LocalTensor 四级缓存怎么用。搞清楚了,后面的开发跟 CUDA 差别不大。仓库在这里:

https://atomgit.com/cann/opbase

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

相关文章:

  • Taotoken审计日志功能在满足企业合规与安全需求中的作用观察
  • 解锁真实质感:Midjourney V6纹理生成的7个精准提示词组合(含金属/织物/锈蚀实测数据)
  • OpenHuman 从零到上手(2026年5月最新版)
  • 时间人格测试平台测评|专业在线时间性格测试深度评测 - 资讯焦点
  • 如何彻底释放华硕笔记本性能:G-Helper轻量控制工具终极指南
  • 论文AI率超标不用愁:4种实用方法+3个提速技巧 - agihub
  • 让传统汽车获得L2级智能驾驶:openpilot开源系统的5大技术突破
  • OpenClawClaudeCodePython搭建股票期权自动交易系统实现低风险高收益-实战
  • 私有化部署即时通讯 vs 公有云即时通讯:完整对比与选型建议 - 小天互连即时通讯
  • 2026 平顶山专业防水公司TOP5推荐:卫生间、外墙、楼顶、地下室渗漏专业公司推荐(2026年5月平顶山最新深度调研方案) - 防水百科
  • 5步快速上手ComfyUI JoyCaption插件:AI图片字幕生成的终极指南
  • 携程任我行礼品卡回收哪里价格亲民,回收方法解答 - 猎卡回收公众号
  • 在Node.js服务中集成Taotoken实现统一的多模型调用网关
  • AutoCAD字体管理终极指南:FontCenter让您彻底告别字体缺失烦恼
  • C++的输入与输出和格式化输出
  • stm32的DMA学习笔记 串口空闲中断+dma
  • Bifrost:跨平台三星固件管理工具的3个技术突破
  • 携程任我行礼品卡回收变现技巧,解锁闲置卡券的价值 - 京顺回收
  • WechatBakTool:如何快速安全备份微信聊天记录的完整终极指南 [特殊字符]️
  • Cursor Pro破解工具终极指南:5分钟实现AI编程助手永久免费使用
  • 【紧急更新】Midjourney 6.2纹理引擎重大调整!3小时内必须掌握的4个参数避坑指南
  • 仓储物流管理系统推荐:2026 年十大 WMS 深度测评对比
  • 艺术设计论文降AI工具怎么选?创意设计类降AI实用方案 - 仙仙学姐测评
  • Multiverse 引擎3.0:大屏、移动、AR三端覆盖,AR交互功能详解
  • 从项目集成到团队协作:Poppins字体在现代开发中的全方位应用指南
  • 聚力数字基建迭代|2026全球优质建站机构盘点 筑牢品牌线上竞争力
  • ## 广州从化年营收千万级跨境自有品牌老板,跨境财税咨询找哪家专业?|品牌型跨境和铺货型跨境,财税问题完全不在同一个维度 - 欢欢在创业
  • 2026 安阳专业防水公司TOP5推荐:卫生间、外墙、楼顶、地下室渗漏专业公司推荐(2026年5月安阳最新深度调研方案) - 防水百科
  • 缙云定制木门,可以闭眼入
  • ChanlunX技术实现解析:如何通过缠论算法库解决金融技术分析自动化难题