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

昇腾CANN cann-samples:从示例代码到生产力工具的全路径

CANN 55 个仓库里cann-samples 是最容易被低估的一个。它不定义新算子、不优化性能、不做架构设计——只提供可运行的代码示例。但正是因为「只提供示例」cann-samples 是新手最快上手、老手最常查阅的仓库。每个示例都是独立可编译的项目从环境检查到编译到运行到结果验证一条命令走完。cann-samples 的组织结构cann-samples/ ├── 01-basic/ │ ├── hello_world/ # 第一个 Ascend C 程序 │ ├── vector_add/ # Vector 加法最简单的算子 │ └── tensor_basic/ # 张量基本操作 ├── 02-op-dev/ │ ├── custom_activation/ # 自定义激活函数算子 │ ├── fused_op/ # 算子融合bias activation │ └── multi_core/ # 多核并行计算 ├── 03-inference/ │ ├── acl_infer/ # ACL 推理图像分类 │ ├── onnx_infer/ # ONNX 模型推理 │ └── dynamic_batch/ # 动态 batch 推理 ├── 04-training/ │ ├── gradient_reduce/ # 梯度规约分布式中高频操作 │ └── mixed_precision/ # 混合精度训练 ├── 05-tools/ │ ├── profiling/ # 性能分析工具使用 │ └── debug/ # 算子调试技巧 └── 06-hccl/ ├── allreduce/ # AllReduce 集合通信 └── point_to_point/ # 点对点通信每个示例目录包含四个文件main.cpp入口、kernel.cpp算子实现、CMakeLists.txt构建、README.md说明。结构统一读完一个就能类推到其他所有示例。从零到跑通hello_world第一个 Ascend C 程序不需要理解完整的 kernel 概念。hello_world 示例只做一件事把一段数据从 host 传到 NPU算个加法再传回来。// 01-basic/hello_world/kernel.cpp#includekernel_operator.h// Ascend C 算子框架头文件// 最简单的加法 kerneloutput input_a input_bclassHelloAdd{public:// Ascend C 的入口函数标记为 __aicore____aicore__voidProcess(GlobalTensorfloatoutput,GlobalTensorfloatinput_a,GlobalTensorfloatinput_b,intsize){// 从 HBM 加载数据到 L1本地缓存LocalTensorfloatlocal_aDataCopy(input_a,size);LocalTensorfloatlocal_bDataCopy(input_b,size);// Pipe 是 Ascend C 的编排机制// 等数据加载完成后再开始计算PipeBarrier(PIPE_ALL);// Vector 单元逐元素加法LocalTensorfloatlocal_olocal_alocal_b;// 结果写回 HBMDataCopy(output,local_o,size);}};// host 端调用intmain(){intsize256;floata[256],b[256],o[256];// 初始化输入数据for(inti0;isize;i){a[i]i*1.0f;b[i]i*2.0f;}// 第一步初始化 AscendCL 运行时aclInit(nullptr);// 第二步选择 NPU 设备aclrtSetDevice(0);// 第三步分配 HBM拷贝输入数据到 NPUauto*d_aAllocTensorfloat(size);auto*d_bAllocTensorfloat(size);auto*d_oAllocTensorfloat(size);CopyToDevice(d_a,a,size);CopyToDevice(d_b,b,size);// 第四步创建 kernel 实例并执行HelloAdd kernel;kernel.Process(d_o,d_a,d_b,size);// 第五步从 HBM 拷贝结果回 hostCopyFromDevice(o,d_o,size);// 第六步验证结果// o[i] 应该是 i 2*i 3*ifor(inti0;isize;i){assert(fabs(o[i]-3.0f*i)1e-6);}// 释放 HBMFreeTensor(d_a);FreeTensor(d_b);FreeTensor(d_o);// 释放 AscendCL 资源aclrtResetDevice(0);aclFinalize();printf(Hello World from Ascend NPU!\n);return0;}编译运行只需要三行命令cdcann-samples/01-basic/hello_worldmkdirbuildcdbuild cmake..-DCMAKE_INSTALL_PREFIX/usr/localmake-j./hello_world# 输出Hello World from Ascend NPU!算子融合示例fused_op算子融合是 cann-samples 里最有实战价值的示例。它演示怎么把两个独立算子bias add relu activation融合成一个 kernel——省掉中间结果的 HBM 读写。// 02-op-dev/fused_op/kernel.cpp// 关键不使用 DataCopy 读写中间结果// bias add 在 L1 里算完结果直接喂给 relu——不写回 HBM__aicore__voidFusedBiasRelu(GlobalTensorfloatoutput,GlobalTensorfloatinput,GlobalTensorfloatbias,intsize){// 第一步加载 input 和 bias 到 L1LocalTensorfloatlocal_inDataCopy(input,size);LocalTensorfloatlocal_bDataCopy(bias,size);PipeBarrier(PIPE_ALL);// 第二步bias add——结果留在 L1不写回 HBM// 注意这里没有 DataCopy 写回也没有额外的 PipeBarrierLocalTensorfloatlocal_addedlocal_inlocal_b;// 第三步relu——直接消费 local_added同样在 L1 里算// ReLU max(input, 0)LocalTensorfloatzero(size);zero0.0f;LocalTensorfloatlocal_outMax(local_added,zero);// 第四步结果才写回 HBM只写一次DataCopy(output,local_out,size);}融合和不融合的对比指标独立算子两次调用融合算子一次调用HBM 读次数2input 各读一次1只读 inputHBM 写次数2add 结果relu 结果各写一次1只写最终结果总 HBM 搬运量4 × size × 4B 16MB2 × size × 4B 8MBL1 缓存复用无两个 kernel 隔离有add 结果直接喂 relu算子融合的收益不在于计算减少——add 和 relu 本身算力很低——而在于消掉了一次 HBM 写中间结果和一次 HBM 读重复读 input。踩坑一PipeBarrier 放错位置PipeBarrier 的语义是「等前面所有指令完成」。如果位置放错会导致计算和搬运的并行性被错误打断。错误位置bias add 和 relu 之间LocalTensorfloatlocal_addedlocal_inlocal_b;PipeBarrier(PIPE_ALL);// 错误这里等了一次——打断了流水线LocalTensorfloatlocal_outMax(local_added,zero);bias add 结果local_added已经在 L1 了——relu 可以直接消费不需要等。中间的 PipeBarrier 浪费了一个 cycle 的延迟打破了「计算 → 直接消费」的流水线语义。正确做法只在数据依赖确实跨越 HBM→L1 的边界时才加 PipeBarrier。LocalTensorfloatlocal_inDataCopy(input,size);// L1-HBM异步LocalTensorfloatlocal_bDataCopy(bias,size);// L1-HBM异步PipeBarrier(PIPE_ALL);// 正确等待加载完成后再开始计算LocalTensorfloatlocal_addedlocal_inlocal_b;// 不需要 PipeBarrierlocal_added 已经在 L1 里LocalTensorfloatlocal_outMax(local_added,zero);DataCopy(output,local_out,size);// 异步写回踩坑二多核并行时忽略核间负载均衡multi_core 示例演示了多核并行——把数据切分到多个 AI Core 上同时算。但如果切分不均匀快的 core 等慢的 core总体延迟被最慢的 core 拖累。错误切分size1000core_num8// 每个 core 分 ceil(1000/8) 125 个元素// core 0: [0, 125) → 125 个// core 1: [125, 250) → 125 个// ...// core 7: [875, 1000) → 125 个// 但实际只有 core 0-6 有 125 个core 7 也是 1000-875125 个吗// 不——size1000 被 8 整除恰好是 125// 但如果 size1001// core 0-6: 126 个core 7: 1 个// core 0-6 在 L1 里做 126 次迭代core 7 只做 1 次// PipeBarrier(PIPE_ALL) 的时候 core 7 要等前 6 个 core 的 126 次迭代算完// 损失(126-1)/126 99% 的时间在等正确切分动态负载均衡// 每个 core 处理相同数量的元素// 如果 size 不能被 core_num 整除前 core_num-1 个 core 处理相同的元素数// 最后一个 core 处理余数intelements_per_coresize/core_num;// 每个 core 的基本量intremaindersize%core_num;// 余数// 用 split_balancing 策略把余数平均分到前 remainder 个 core// core 0: elements_per_core 1 (多一个)// core 1: elements_per_core 1// ...// core remainder-1: elements_per_core 1// core remainder: elements_per_core踩坑三调试时用了 Debug 模式的 kernel示例代码的 Debug 模式会关掉大部分编译器优化——性能下降 5-10×。在 Debug 模式下调试逻辑 bug 没问题但如果尝试用 Debug 模式跑性能分析profiling得到的数据完全不可信。正确做法调试分两阶段。# 阶段一Debug 模式下查逻辑 bugcmake..-DCMAKE_BUILD_TYPEDebugmake-j./fused_op_test# 跑单元测试、验证结果正确性# 阶段二Release 模式下跑性能分析cmake..-DCMAKE_BUILD_TYPEReleasemake-j./profiling_demo# 跑 profiling、测 HBM 带宽、看 Cube 利用率Debug 模式下的 PipeBarrier 延迟、L1 缓存命中率、Cube 利用率在 Release 模式下完全不同——因为编译器在 Release 模式下做了循环展开、指令重排、寄存器分配等大量优化。cann-samples 的每个示例都值得运行一次。不是因为代码多么精妙——恰恰相反是因为它们简单到不需要解释就能读懂。读懂之后改成自己的场景就是第一个能跑的 NPU 程序。从 hello_world 到 multi_core从 profiling 到 hccl_allreduce整个学习路径都在 cann-samples 里。

相关文章:

昇腾CANN cann-samples:从示例代码到生产力工具的全路径

CANN 55 个仓库里,cann-samples 是最容易被低估的一个。它不定义新算子、不优化性能、不做架构设计——只提供可运行的代码示例。但正是因为「只提供示例」,cann-samples 是新手最快上手、老手最常查阅的仓库。每个示例都是独立可编译的项目:…...

Webdash API详解:如何通过RESTful接口扩展和集成外部系统

Webdash API详解:如何通过RESTful接口扩展和集成外部系统 【免费下载链接】webdash 🔥 Orchestrate your web project with Webdash the customizable web dashboard 项目地址: https://gitcode.com/gh_mirrors/we/webdash Webdash作为一款可定制…...

React状态管理权威评测:ReactStateMuseum中的10大热门方案

React状态管理权威评测:ReactStateMuseum中的10大热门方案 【免费下载链接】ReactStateMuseum A whirlwind tour of React state management systems by example 项目地址: https://gitcode.com/gh_mirrors/re/ReactStateMuseum ReactStateMuseum是一个全面的…...

MakeMeAHanzi完整指南:如何免费获取9000+汉字笔画动画数据

MakeMeAHanzi完整指南:如何免费获取9000汉字笔画动画数据 【免费下载链接】makemeahanzi Free, open-source Chinese character data 项目地址: https://gitcode.com/gh_mirrors/ma/makemeahanzi MakeMeAHanzi是一个免费开源的汉字数据项目,为开发…...

如何用开源自动化工具告别抢票焦虑:大麦自动抢票系统完全指南

如何用开源自动化工具告别抢票焦虑:大麦自动抢票系统完全指南 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为心仪演唱会门票秒空…...

大规模集群中的ksync:性能测试与资源占用优化策略

大规模集群中的ksync:性能测试与资源占用优化策略 【免费下载链接】ksync Sync files between your local system and a kubernetes cluster. 项目地址: https://gitcode.com/gh_mirrors/ks/ksync 在当今云原生开发环境中,Kubernetes文件同步工具…...

EmotiVoice终极指南:5分钟上手2000种音色的免费语音合成神器

EmotiVoice终极指南:5分钟上手2000种音色的免费语音合成神器 【免费下载链接】EmotiVoice EmotiVoice 😊: a Multi-Voice and Prompt-Controlled TTS Engine 项目地址: https://gitcode.com/gh_mirrors/em/EmotiVoice 想要让AI帮你说话吗&#xf…...

LEO卫星自愈网络:动态抗干扰与信号合并算法实践

1. 项目概述:LEO卫星自愈网络的设计挑战与创新方案在近地轨道(LEO)卫星通信领域,我们正面临着一个关键的技术矛盾:一方面,LEO卫星凭借其低延迟特性成为下一代全球通信网络的核心组成部分;另一方…...

常见网站呀

​ 1、deepseek 2、Kimi 3、智谱清言 4、文小言 ​5、globaldossier 6、豆包 7、密塔 8、必应 9、百度 10、himmpat 11、web of science...

Vue3拖拽缩放组件:如何用5分钟为你的应用添加专业级交互体验

Vue3拖拽缩放组件:如何用5分钟为你的应用添加专业级交互体验 【免费下载链接】vue3-draggable-resizable [Vue3 组件] 用于拖拽调整位置和大小的的组件,同时支持元素吸附对齐,实时参考线。 项目地址: https://gitcode.com/gh_mirrors/vu/vu…...

Keil C251中HEX文件生成异常的解决方案

1. 问题现象与背景解析最近在调试基于Intel USB Hub参考设计的嵌入式系统时,遇到一个颇为蹊跷的问题。当我从Intel官网下载了完整的USB Hub设备示例代码(约40多页的C251汇编混合代码),通过Keil Vision环境编译后,生成的…...

FanControl终极指南:3个核心模块助你打造完美风扇控制方案

FanControl终极指南:3个核心模块助你打造完美风扇控制方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

服务器末级缓存优化:指令-数据关联性管理技术

1. 服务器工作负载中的末级缓存挑战在现代多核处理器架构中,共享末级缓存(Shared Last-Level Cache, LLC)的性能优化一直是计算机体系结构研究的核心课题。随着云计算和分布式计算的普及,服务器工作负载呈现出两个显著特征:指令足迹(instruct…...

CaldroidListener使用教程:轻松实现Android日期点击事件处理

CaldroidListener使用教程:轻松实现Android日期点击事件处理 【免费下载链接】Caldroid A better calendar for Android 项目地址: https://gitcode.com/gh_mirrors/ca/Caldroid Caldroid是一款功能强大的Android日历组件,而CaldroidListener则是…...

Claude Desktop for Linux桌面集成:.desktop文件与MIME类型配置

Claude Desktop for Linux桌面集成:.desktop文件与MIME类型配置 【免费下载链接】claude-desktop-debian Claude Desktop for Linux 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-desktop-debian Claude Desktop for Linux是一款强大的桌面应用…...

MQTTClient技术深度解析:嵌入式物联网通信的高性能解决方案

MQTTClient技术深度解析:嵌入式物联网通信的高性能解决方案 【免费下载链接】mqttclient A high-performance, high-stability, cross-platform MQTT client, developed based on the socket API, can be used on embedded devices (FreeRTOS / LiteOS / RT-Thread …...

3步彻底告别重复GUI操作:零代码AI助手如何让你每天节省2小时

3步彻底告别重复GUI操作:零代码AI助手如何让你每天节省2小时 【免费下载链接】UI-TARS-desktop The Open-Source Multimodal AI Agent Stack: Connecting Cutting-Edge AI Models and Agent Infra 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desk…...

Conductor工作流引擎:5个步骤构建企业级分布式任务编排系统

Conductor工作流引擎:5个步骤构建企业级分布式任务编排系统 【免费下载链接】conductor Distributed workflow server 项目地址: https://gitcode.com/gh_mirrors/cond/conductor 在当今复杂的微服务架构中,分布式任务编排已经成为企业数字化转型…...

终极指南:如何在macOS上实现Windows风格的Alt-Tab窗口切换

终极指南:如何在macOS上实现Windows风格的Alt-Tab窗口切换 【免费下载链接】alt-tab-macos Windows alt-tab on macOS 项目地址: https://gitcode.com/gh_mirrors/al/alt-tab-macos 你是否曾在macOS上怀念Windows的Alt-Tab快速窗口切换体验?alt-…...

Pills CSS Grid高级技巧:嵌套布局、偏移量与自定义宽度全解析

Pills CSS Grid高级技巧:嵌套布局、偏移量与自定义宽度全解析 【免费下载链接】pills A simple responsive CSS Grid for humans. View Demo - 项目地址: https://gitcode.com/gh_mirrors/pi/pills Pills CSS Grid是一个简单、响应式、轻量级的CSS网格系统&…...

美国签证预约监控工具:自动发现更早日期并邮件通知

美国签证预约监控工具:自动发现更早日期并邮件通知 【免费下载链接】US-visa-appointment-notifier This is just a script I put together to check and notify me via email (MailGun) when theres an earlier date before my initial appointment date. It doesn…...

Ventoy主题定制完全指南:让你的启动界面焕然一新!

Ventoy主题定制完全指南:让你的启动界面焕然一新! 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy 还在使用单调乏味的启动界面吗?Ventoy作为一款革命性的可启动U盘解…...

RefineDet检测结果可视化:使用refinedet_demo.py轻松实现目标标注

RefineDet检测结果可视化:使用refinedet_demo.py轻松实现目标标注 【免费下载链接】RefineDet Single-Shot Refinement Neural Network for Object Detection, CVPR, 2018 项目地址: https://gitcode.com/gh_mirrors/re/RefineDet RefineDet是一种高效的单阶…...

3步解锁安全镜像烧录:Balena Etcher让系统部署零风险

3步解锁安全镜像烧录:Balena Etcher让系统部署零风险 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 还在为制作系统启动盘而烦恼吗?你是…...

nvm-desktop技术深度解析:跨平台Node.js版本管理架构设计

nvm-desktop技术深度解析:跨平台Node.js版本管理架构设计 【免费下载链接】nvm-desktop Node Version Manager Desktop - A desktop application to manage multiple active node.js versions. 项目地址: https://gitcode.com/gh_mirrors/nv/nvm-desktop nvm…...

别再为查重和 AIGC 检测头秃!okbiye 降重 + 降 AIGC 双功能,论文安全过审的最后一道防线

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 一、前言:论文提交前,你最怕的两个 “隐形杀手” 论文写到定稿,才发现重复率超标、AIGC 检测不过&am…...

tinychain实战教程:10步掌握区块链交易验证与挖矿机制

tinychain实战教程:10步掌握区块链交易验证与挖矿机制 【免费下载链接】tinychain A pocket-sized implementation of Bitcoin 项目地址: https://gitcode.com/gh_mirrors/ti/tinychain tinychain是一个轻量级的比特币实现,让你能够快速理解区块链…...

okbiye 降重 | 降 AIGC 功能实测:双标检测时代,论文合规通关的新解法

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 引言:从 “单查重” 到 “双标审”,毕业论文合规压力的全面升级 当你熬夜写完一篇万字毕业论文,用查…...

从查重红到检测绿:用 okbiye 搞定论文降重 + 降 AIGC,毕业季再也不慌

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 毕业季的论文环节,查重和 AIGC 检测是两道绕不开的坎。看着查重报告里大片的红色标注重复率,又担心 AI 生成痕迹过…...

如何构建活跃的AI技能社区:Awesome Agent Skills线上线下活动完整指南

如何构建活跃的AI技能社区:Awesome Agent Skills线上线下活动完整指南 【免费下载链接】awesome-agent-skills A curated collection of 1000 agent skills from official dev teams and the community, compatible with Claude Code, Codex, Gemini CLI, Cursor, a…...