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

昇腾CANN cmake:CANN 项目的 CMake 构建模块实战

从 ops-nn 到 cann-recipes-*几乎所有 CANN 开源仓库都用 CMake 做构建系统。cann-cmake 仓库提供一套标准的 CMake 模块——FindCANN.cmake找到 CANN 安装路径、AscendCCore.cmakeAscend C 编译规则、AscendKernel.cmakekernel 编译和链接——让开发者的 CMakeLists.txt 从 200 行缩减到 20 行。FindCANN.cmake自动发现 CANN 安装传统做法是手动设ASCEND_HOME_PATH环境变量CMake 脚本里写死路径。cann-cmake 的 FindCANN 自动发现。# CMakeLists.txt最少配置 cmake_minimum_required(VERSION 3.16) project(my_ascend_op LANGUAGES CXX) # 引入 CANN CMake 模块 list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) include(FindCANN) # FindCANN 自动做了这些事 # 1. 搜索 $ASCEND_HOME_PATH 环境变量用户自定义 # 2. 搜索 /usr/local/Ascend默认安装路径 # 3. 设置 CANN_INCLUDE_DIRS头文件路径 # 4. 设置 CANN_LIBRARIES库文件路径 # 5. 检查 CANN 版本通过 version.txt # 6. 如果找不到 → 报错 提示安装 message(STATUS CANN version: ${CANN_VERSION}) message(STATUS CANN include: ${CANN_INCLUDE_DIRS}) message(STATUS CANN libs: ${CANN_LIBRARIES}) # 版本检查有些特性只在 8.0 可用 if(CANN_VERSION VERSION_LESS 8.0.0) message(FATAL_ERROR CANN 8.0 required (flash attention and MC2)) endif()FindCANN 内部逻辑# FindCANN.cmake 核心实现 # 搜索优先级$ASCEND_HOME_PATH /usr/local/Ascend pkg-config find_path(CANN_ROOT_DIR NAMES version.cfg PATHS $ENV{ASCEND_HOME_PATH} /usr/local/Ascend /opt/Ascend PATH_SUFFIXES ascend-toolkit/latest ascend-toolkit/8.0.0 ) if(NOT CANN_ROOT_DIR) message(FATAL_ERROR CANN not found. Install CANN toolkit or set ASCEND_HOME_PATH.\n Download: https://www.hiascend.com/software/cann) endif() # 提取版本信息 file(READ ${CANN_ROOT_DIR}/version.cfg CANN_VER_STR) string(REGEX MATCH [0-9]\\.[0-9]\\.[0-9] CANN_VERSION ${CANN_VER_STR}) # 自动找到子目录 set(CANN_INCLUDE_DIRS ${CANN_ROOT_DIR}/include ${CANN_ROOT_DIR}/include/ascendc ${CANN_ROOT_DIR}/opp/built-in/op_proto/custom # 算子原型 ) set(CANN_LIBRARIES ${CANN_ROOT_DIR}/lib64/libascendcl.so ${CANN_ROOT_DIR}/lib64/libge_executor.so ${CANN_ROOT_DIR}/lib64/libascend_hal.so ) find_package_handle_standard_args(CANN REQUIRED_VARS CANN_ROOT_DIR CANN_INCLUDE_DIRS CANN_LIBRARIES VERSION_VAR CANN_VERSION )AscendCCore.cmakeAscend C 源代码编译Ascend C 的 kernel 代码.cpp 文件且内部用 Ascend C API需要 TIKC 编译器编译不是普通的 C 编译器。AscendCCore 封装了 tikcc 的调用规则。# 引入 Ascend C 编译规则 include(AscendCCore) # 定义 Ascend C kernel 源文件 ascendc_add_library(my_ops STATIC kernels/matmul_tiling.cpp kernels/softmax_fusion.cpp kernels/gelu_activation.cpp LINK_LIBRARIES ${CANN_LIBRARIES} COMPILE_OPTIONS -DBLOCK_DIM32 -DMATMUL_TILE_M16 -DMATMUL_TILE_N16 ) # ascendc_add_library 的底层操作 # 1. 用 tikccTIK 编译器把 .cpp → .oAscend C → 二进制 # 2. 设置正确的目标架构--soc-versionascend910 # 3. 链接 runtime 和 driver 库 # 4. 生成适用于动态加载的 .so # 等价的手动命令ascendc_add_library 内部执行 # tikcc kernels/matmul_tiling.cpp \ # --targetascend910 \ # --opt-level3 \ # -I${CANN_INCLUDE_DIRS} \ # -c -o matmul_tiling.o关键tikcc是 CANN 的 Ascend C 编译器。它和 GCC 是不同的工具链——GCC 编译的是给 CPU 执行的代码tikcc 编译的是给 NPU 执行的代码。ascendc_add_library自动选择正确的编译器。AscendKernel.cmake多架构 kernel 编译同一份 Ascend C 代码在不同 NPU 架构上需要不同的编译优化——Ascend 910 (达芬奇) 和 Ascend 950DT (下一代) 的 L1 缓存大小不同tile 大小也不同。AscendKernel 支持多架构编译。include(AscendKernel) # 为多架构编译 kernel ascend_multi_arch_kernel(my_ops_kernel SOURCES kernels/matmul.cpp ARCHITECTURES ascend910 ascend950 # 可选下一代架构编译 COMPILE_FLAGS_ascend910 -DL1_CACHE_SIZE32KB -DTILE_M16 COMPILE_FLAGS_ascend950 -DL1_CACHE_SIZE64KB # 更大的 L1 → 更大的 tile -DTILE_M32 ) # 生成的文件结构 # build/ # ├── ascend910/ # │ └── my_ops_kernel.so Architecture 910 optimized # ├── ascend950/ # │ └── my_ops_kernel.so Architecture 950 optimized # └── generic/ # └── my_ops_kernel.so 通用实现动态选择运行时自动选择对应架构的 kernel// CANN runtime 自动选择对应硬件架构的 .so// 不需要手动判断 NPU 型号auto*kernelAscendRuntime::LoadKernel(my_ops_kernel);// runtime 内部// if (npu_arch Ascend910) → load ascend910/my_ops_kernel.so// if (npu_arch Ascend950) → load ascend950/my_ops_kernel.soops-proto 自动生成CANN 的算子库都有ops-proto目录——算子的 Protobuf 定义输入输出描述。cmake 仓库提供了 Protobuf 编译规则。# 自动生成算子 Proto不需要手动编译 include(AscendOpsProto) ascend_ops_proto_generate(MY_OPS PROTO_FILES ops-proto/matmul.proto ops-proto/softmax.proto ops-proto/gelu.proto OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated ) # 生成的 C 文件 # generated/matmul.pb.h ← 包含 MatMulOp 的 Protobuf 结构 # generated/matmul.pb.cc # generated/softmax.pb.h # ... # 链接到最终的 .so target_link_libraries(my_ops PRIVATE MY_OPS_PROTO)算子的 Proto 定义包含输入输出 tensor 的类型和形状信息——ge图引擎用这些信息做图优化。完整项目的 CMakeLists.txt组合 FindCANN AscendCCore AscendKernel AscendOpsProto 四件套cmake_minimum_required(VERSION 3.16) project(ascend-ops-project VERSION 1.0.0 LANGUAGES CXX) # 引入 CANN CMake 模块从 cann-cmake 仓库 list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/cann-cmake) include(FindCANN) include(AscendCCore) include(AscendKernel) include(AscendOpsProto) # 版本检查 if(CANN_VERSION VERSION_LESS 8.0.0) message(FATAL_ERROR CANN 8.0 required) endif() # 算子 Proto 生成 ascend_ops_proto_generate(OPS_PROTO PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/ops-proto/*.proto OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated/proto ) # Ascend C kernel 编译 ascendc_add_library(ops_kernels STATIC ${CMAKE_CURRENT_SOURCE_DIR}/kernels/*.cpp COMPILE_OPTIONS -DBLOCK_DIM32 LINK_LIBRARIES OPS_PROTO ${CANN_LIBRARIES} ) # 多架构编译 ascend_multi_arch_kernel(ops_kernels_opt SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/kernels/matmul_tuned.cpp ARCHITECTURES ascend910 ascend950DT # Atlas A2 服务器 ) # 最终产物 add_executable(ops_test test/main.cpp) target_link_libraries(ops_test PRIVATE ops_kernels ops_kernels_opt)踩坑一FindCANN 在新版安装路径下的版本文件路径CANN 8.5 的安装路径变了旧版/usr/local/Ascend/ascend-toolkit/8.0.0/version.cfg新版/usr/local/Ascend/ascend-toolkit/latest/version.cfg。FindCANN.cmake 如果只搜固定路径在新版 CANN 上会搜不到。修复在 FindCANN.cmake 里同时搜索*/latest/和*/8.x.x/。# 同时搜索 latest 和带版本号的路径 find_path(CANN_ROOT_DIR NAMES version.cfg PATHS ${ASCEND_HOME}/ascend-toolkit/latest ${ASCEND_HOME}/ascend-toolkit/8.5.0 ${ASCEND_HOME}/ascend-toolkit/8.0.0 ${ASCEND_HOME}/ascend-toolkit DOC Root directory of CANN toolkit )踩坑二Ascend C 编译的预处理器宏不展开ascendc_add_library的COMPILE_OPTIONS用-D传递编译时参数。但-DTILE_M16在 tikcc 里是TILE_M16——tikcc 的预处理宏有特殊语法不能和 GCC 混用。错误ascendc_add_library(my_ops STATIC kernels/matmul.cpp COMPILE_OPTIONS -DTILE_M16 -DTILE_N16 # GCC 风格的预定义宏 )tikcc 不接受空格式的-D——报unknown compiler flag。正确ascendc_add_library(my_ops STATIC kernels/matmul.cpp COMPILE_DEFINITIONS TILE_M16 TILE_N16 # ascenc_add_library 内部会根据这些 DEFINITIONS 生成 tikcc 风格的 # --defineTILE_M16 --defineTILE_N16 )踩坑三Protobuf 编译依赖遗漏ascend_ops_proto_generate自动生成的.pb.cc文件需要链接 Protobuf 运行时库。但默认不链接——因为假设系统中已经全局安装了 libprotobuf。修复在 CMakeLists.txt 里显式加find_package(Protobuf)。find_package(Protobuf REQUIRED) ascend_ops_proto_generate(OPS_PROTO PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR}/ops-proto/*.proto OUTPUT_DIR ${CMAKE_BINARY_DIR}/generated/proto ) target_link_libraries(ops_kernels PRIVATE OPS_PROTO protobuf::libprotobuf # ← 必须显式链接 ${CANN_LIBRARIES} )如果不加protobuf::libprotobuf链接时会报undefined reference to google::protobuf::...。cann-cmake 的价值不在复杂的构建逻辑——在于标准化。所有 CANN 开源仓库用同一套 CMake 模块FindCANN AscendCCore AscendOpProto开发者的 CMakeLists.txt 写 20 行就够。对着镜像的 CANN 版本找不同的 FindCANN 路径——标准化消除了这些重复劳动。

相关文章:

昇腾CANN cmake:CANN 项目的 CMake 构建模块实战

从 ops-nn 到 cann-recipes-*,几乎所有 CANN 开源仓库都用 CMake 做构建系统。cann-cmake 仓库提供一套标准的 CMake 模块——FindCANN.cmake(找到 CANN 安装路径)、AscendCCore.cmake(Ascend C 编译规则)、AscendKern…...

昇腾CANN cann-spack-package:Spack 包管理器的 CANN 集成实战

HPC(高性能计算)圈子里不用 pip 和 conda——用 Spack。Spack 是一个专为科学计算设计的包管理器,能同时管理一个软件包的多个版本(不同编译器、不同依赖版本、不同架构),每个变体独立安装在 spack/opt/ 下…...

1. NLP课程大纲

NLP 学习大纲: 自然语言处理入门 文本预处理 RNN及其变体 Transformer 迁移学习 1. 自然语言处理入门 1.1 什么是自然语言处理 计算机科学与语言学中 关注于计算机与人类语言间转换的领域 1.2 AI 的几个时间点 1️⃣ CV领域 2012年分水岭:2012年 al…...

机器学习基础算法

机器学习基础算法 1. 技术分析 1.1 机器学习概述 机器学习是数据科学的核心: 机器学习类型监督学习: 有标签数据无监督学习: 无标签数据半监督学习: 部分标签强化学习: 交互学习学习任务:分类: 离散输出回归: 连续输出聚类: 分组1.2 监督学习算法 监督学习算法线性模…...

为什么你的 Agent 总是“偷懒”?大模型惰性与激励提示词研究

为什么你的 Agent 总是“偷懒”?大模型惰性与激励提示词研究 各位知识工作者、AI 产品经理、大模型开发者、编程爱好者——如果你正在开发或使用基于大语言模型(LLMs)的智能体(Agent),或者只是在日常用 ChatGPT、Claude、文心一言这类工具时,肯定遇到过这类令人抓狂的场…...

统计分析方法与假设检验

统计分析方法与假设检验 1. 技术分析 1.1 统计分析概述 统计分析是数据科学的基础方法: 统计分析类型描述统计: 数据概括推断统计: 假设检验回归分析: 变量关系时间序列: 时序数据统计方法:参数检验: t检验、方差分析非参数检验: Mann-Whitney、卡方检验相关性分…...

Claude API文档不是说明书,而是契约:用Swagger UI+Postman Collection+TypeScript SDK三件套构建零歧义协作协议

更多请点击: https://kaifayun.com 第一章:Claude API文档不是说明书,而是契约 Claude API 文档的本质并非操作指南或功能速查手册,而是一份具有技术约束力的**双向契约**——它明确定义了客户端与 Anthropic 服务之间在请求结构…...

NVIDIA Vera Rubin 平台如何解决 Agentic AI 的 Scale-up 难题

NVIDIA Vera Rubin 平台如何解决 Agentic AI 的 Scale-up 难题 [外链图片转存中…(img-5hHDDlgn-1779546321135)] Agentic AI 改变了推理系统的负载形态。传统推理通常可以理解为一次请求、一次生成;Agentic inference 则会展开成非确定性轨迹:Agent 做…...

五轴联动机床:什么叫真正做出来了,什么叫组装贴牌

机床厂的数量从来不是问题。打开任何一份机床企业名录,数以千计的厂商密密麻麻排在那里,官网上都写着"五轴联动"“高精度数控”“航空级加工”。但做五轴联动整机与自主数控系统的工厂,放到整个行业里只是极小的一部分;…...

boss app sig/sp/响应体 unidbg分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 侵权通过头像私信或名字简介叫我删除博…...

根据lab1.pdf总结的知识点

第一题:简单的应用程序(Hello.java)类与主方法:Java程序入口必须是public static void main(String args[]),public表示该方法能被JVM访问,static表示无需创建对象即可调用,void表示无返回值&am…...

仓储海量货物人车混跑,无感定位并发能力碾压UWB上限瓶颈技术白皮书方案

仓储海量货物人车混跑,无感定位并发能力碾压UWB上限瓶颈技术白皮书方案一、方案概述随着现代智能仓储向高密度、高周转、无人化、集约化模式快速迭代,立体仓储库区普遍形成海量货物堆叠、多叉车穿梭、人员高频作业、人车密集混跑的复杂动态工况。仓储作业…...

大白话拆解AI黑话!从LLM到Agent,一篇扫盲无压力

前言:别再被AI名词劝退了 有没有一种感觉:现在刷技术文章、看AI项目、聊行业趋势,满屏都是 LLM、Token、上下文、RAG、Agent、幻觉…… 每个词都似懂非懂,搜完解释看完就忘,想用的时候依旧一头雾水。 其实所有AI名词&a…...

内网渗透之横向移动实战

在红队渗透测试中,当我们通过 Web 渗透拿到边界服务器的权限后,往往不会止步于此 —— 内部网络中还隐藏着更多的核心资产,比如存储着企业所有账号信息的域控制器。而横向移动,就是我们从边界主机出发,一步步渗透到内网…...

Harness与Agent SDK的边界划分:最佳实践

Harness与Agent SDK的边界划分:最佳实践 引言 在云原生软件交付的下半场,企业面临的核心矛盾已经从「有没有工具链」变成了「能不能把工具链用出价值」。作为全球领先的软件交付平台(SDP),Harness凭借开箱即用的CI/CD、Feature Flag、混沌工程、合规治理等能力,已经成为…...

08-系统技术架构师必备——分布式系统理论与数据一致性

关键词:分布式系统、CAP定理、BASE理论、Paxos、Raft、分布式事务、TCC、Saga、一致性算法 分布式系统 CAP定理 分布式事务 一致性算法 Paxos Raft TCC Saga 系统技术架构师必备——分布式系统理论与数据一致性 摘要 分布式系统是系统技术架构师必须跨越的"分水岭"…...

Keil µVision库模块选择问题解决方案

1. 问题现象解析在Keil Vision IDE 4.53.06版本中,当用户为C51/C251/C166工具链项目添加库文件时,可以通过Options for File对话框选择需要链接的特定模块。这个功能本应记住用户的选择,使得下次打开对话框时保持相同的模块选中状态。但实际使…...

5分钟搞定视频号批量下载:开源工具让效率提升20倍

5分钟搞定视频号批量下载:开源工具让效率提升20倍 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是否还在为下…...

ES 模块:JavaScript 模块化的标准方案

ES 模块:JavaScript 模块化的标准方案 什么是 ES 模块? ES 模块(ES Modules,简称 ESM)是 ECMAScript 2015(ES6)引入的官方模块化规范。 ES 模块 vs CommonJS 特性CommonJSES Modules加载方式同步…...

Python异步编程深度解析:从asyncio到实战应用

Python异步编程深度解析:从asyncio到实战应用 引言 异步编程是现代Python后端开发中不可或缺的技能。作为从Python转向Rust的后端开发者,我发现Python的异步生态非常成熟,尤其是asyncio库提供了强大的异步编程能力。本文将深入探讨Python异步…...

CI/CD最佳实践:构建高效可靠的持续集成和部署流程

CI/CD最佳实践:构建高效可靠的持续集成和部署流程 一、CI/CD最佳实践概述 1.1 CI/CD最佳实践的定义 CI/CD最佳实践是指在持续集成和持续部署过程中遵循的一系列指导原则和方法。它通过自动化、标准化和可重复的流程,提高软件开发和部署的效率和可靠性。 …...

CSS Grid布局深入解析:掌握现代布局技术

CSS Grid布局深入解析:掌握现代布局技术 引言 CSS Grid布局是CSS3引入的强大布局系统,它提供了一种二维网格布局方式,可以轻松实现复杂的页面布局。本文将深入探讨Grid布局的核心概念、高级技巧和最佳实践。 一、Grid布局基础 1.1 Grid容器与…...

回归模型.

...

小波分析多尺度数据融合算法应用【附算法】

✨ 长期致力于小波分析、多尺度数据融合、MEMS陀螺、Allan方差研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)小波域多尺度融合定理证明与算法框架&a…...

鸿蒙PC:鸿蒙electron跨端框架PC链接雷达实战:把本地收藏夹升级成可巡检的链接管理面板

前言 欢迎加入鸿蒙PC开发者社区,共同打造开发者工具生态:鸿蒙PC开发者社区 :https://harmonypc.csdn.net/ 项目开源地址:https://AtomGit.com/lqjmac/ele_lianjieleida 浏览器收藏夹能保存链接,但不擅长保存判断。 …...

Python数据库设计模式:从ORM到数据层架构

Python数据库设计模式:从ORM到数据层架构 引言 数据库设计是后端开发的核心环节。作为从Python转向Rust的后端开发者,我发现Python的数据库生态非常成熟,尤其是SQLAlchemy提供了强大的ORM能力。本文将深入探讨Python数据库设计模式&#xff0…...

数据科学实践案例与项目管理

数据科学实践案例与项目管理 1. 技术分析 1.1 数据科学项目管理概述 数据科学项目管理是确保项目成功的关键: 项目生命周期问题定义: 明确目标数据收集: 获取数据数据处理: 清洗转换模型开发: 构建模型评估验证: 评估效果部署上线: 生产环境项目管理要素:目标设定进…...

大气层Atmosphere系统深度解析:解锁Switch潜能的终极技术指南

大气层Atmosphere系统深度解析:解锁Switch潜能的终极技术指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable Atmosphere大气层系统作为Nintendo Switch最稳定、功能最丰富的定…...

Mootdx架构深度解析:Python金融数据接口的工程化实践

Mootdx架构深度解析:Python金融数据接口的工程化实践 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融科技快速发展的今天,数据获取的便捷性与稳定性成为量化分析的基…...

大模型从0训练LLaMA全流程实战——基于昇腾910B集群

用昇腾集群从零训练一个 LLaMA-7B,走完数据准备、代码修改、分布式配置、启动训练、监控调优的全流程。中间踩过的坑都标注在对应步骤里。 1. 硬件与环境确认(训练前必做) 训练大模型对环境的稳定性要求极高,任何一项不达标都可能导致训练中途崩溃。 #!/bin/bash # 训练前…...