AscendSiPBoost 信号处理加速库实战:环境构建、算子编译与C++调用指南
【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip
本文以 CANN / sip 开源仓库(AscendSiPBoost,下文简称 SiP 库)为对象,系统介绍其在华为 Ascend AI 处理器上的环境搭建、编译构建、安装部署与 C++ 算子调用全流程。读完本文,你将掌握如何从零安装 CANN 依赖、配置目标芯片架构、编译生成 SiP 安装包,并通过asdBlasSdot示例跑通首个信号处理算子,同时了解该库六大功能体系与自定义算子开发的入门路径。
一、什么是 SiP 库:面向信号处理的昇腾加速库
Ascend Signal Processing Boost(昇腾信号处理加速库,下文简称 SiP 库)基于华为 Ascend AI 处理器打造,深度适配硬件算力、存储及内存带宽特性,提供 FFT、BLAS、FIR 滤波、插值等高性能 NPU 算子,为信号处理领域提供高效可靠的算力加速。项目于 2025 年 10 月首次上线,仓库根目录的 README.md 是对该库最权威的入口级说明。
加速库接口功能主要分成六个部分:
| 功能模块 | 定位与职责 |
|---|---|
| 信号处理加速库框架 | 负责算子的管理、算子在 Device 侧的二进制加载以及 Host 侧的 tiling;对上层提供接口以支持单算子调用、多算子批量调用等 |
| FFT 库 | 包含专用的 NPU Kernel 与 PLAN 框架,实现 FFT 系列算子,对外提供接口支持 C2C、C2R 和 R2C 功能 |
| BLAS 库 | 依照 BLAS 相关标准定义提供专用 Kernel,实现 BLAS 系列算子功能,对外提供从 level1 到 level3 的接口 |
| 复数基础计算库 | 提供基础的复数类型算子支持 |
| 信号领域融合算子库 | 包含 PC、MTD、CFAR、Interpolation 等融合算子,支撑脉冲信号分析、动态目标检测、恒虚警等场景 |
| Solver 库 | 主要提供基于 BLAS 的复杂线性代数函数,例如矩阵分解、特征值求解等 |
上述六大模块在仓库结构中均有对应落地:公开头文件统一收敛在 include/asdsip.h,该文件聚合了base_api.h、blas_api.h、fft_api.h、filter_api.h、interp_api.h与domain/rs_api.h六个子头文件;核心实现分别位于core/base(复数基础计算)、core/blas(BLAS 实现)、core/fft(FFT 与 PLAN 框架)、core/filter(FIR 卷积滤波)等目录;算子 Kernel 与 tiling 代码则按算子组织在 ops 目录下,并通过 configs/op_list.yaml 统一登记各算子在具体芯片架构上的可用性(例如SdotF32Kernel、FftC2RC64Kernel、ConvolveKernel均在此列表中按ascend910b/ascend950维度声明)。
二、学习资源与文档地图
开始动手前,建议先建立文档地图:
- 编译与构建:docs/compilation_build.md 详细说明 SiP 库的编译命令、构建参数、芯片架构配置与关键文件;
- 算子开发入门:docs/developing_a_simple_operator.md 以 Conj 算子为例,讲解从零为 SiP 开发一个算子的完整流程;
- 头文件与库文件清单:docs/header_files_library_files.md 说明公开头文件与产物库文件的组织方式;
- API 参考:仓库 docs/zh/API_Reference 目录按 BLAS、FFT、Filter、Interpolation、base 等分类收录了各算子的接口说明文档(如 Asum.md、FFT_1D.md 等);
- 调用示例:example 目录存放了不依赖测试框架、即编即用的算子调用 Demo;
- 问题报告:通过仓库 Issues 提交使用中遇到的问题。
三、环境构建:依赖安装与 CANN 软件部署
3.1 依赖清单与一键安装
本项目源码编译依赖如下工具与三方库,请注意版本要求:
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| python | >= 3.7.0 | 编译与打包脚本运行环境 |
| pyyaml | — | Python 三方库,解析 YAML 配置 |
| gcc / g++ | >= 7.3.0 | C/C++ 编译器 |
| cmake | >= 3.16.0 | 构建系统 |
| pigz | >= 2.4(建议) | 并行压缩工具,提升打包速度 |
| dos2unix | — | 处理脚本换行符 |
| numpy | — | Python 三方库 |
| googletest | v1.14.0(建议) | 仅执行 UT(单元测试)时依赖 |
上述系统级依赖可通过项目脚本一键安装:
bash install_deps.sh从 install_deps.sh 源码看,该脚本会自动探测操作系统(支持 Debian 系 apt、RHEL/openEuler 系 dnf/yum、macOS 系 brew),逐一检查并安装 python、gcc、cmake、pigz、dos2unix、git 与 googletest(googletest 从gitcode.com/cann-src-third-party/googletest下载v1.14.0源码编译安装到/usr/local)。
安装完后,再通过项目根目录的 requirements.txt 继续安装 python 三方库依赖:
pip3 install -r requirements.txtrequirements.txt 内容为numpy、setuptools、wheel三个包。
3.2 安装社区版 CANN toolkit 包
Atlas A2/A3 系列产品:从 CANN 社区版发布仓库获取软件包,选择最新时间版本,并根据产品型号和环境架构下载对应包。
# 确保安装包具有可执行权限 chmod +x Ascend-cann-toolkit_${cann_version}_linux-${arch}.run # 安装命令 ./Ascend-cann-toolkit_${cann_version}_linux-${arch}.run --install --force --install-path=${install_path}参数说明:
${cann_version}:表示 CANN 包版本号;${arch}:表示 CPU 架构,如aarch64、x86_64;${install_path}:表示指定安装路径,默认安装在/usr/local/Ascend目录。
3.3 安装社区版 CANN ops 包
Atlas A2/A3 系列产品:同样从 CANN 社区版发布仓库获取软件包,选择最新时间版本,并根据产品型号和环境架构下载对应包。
# 确保安装包具有可执行权限 chmod +x Ascend-cann-${soc_name}-ops_${cann_version}_linux-${arch}.run # 安装命令 ./Ascend-cann-${soc_name}-ops_${cann_version}_linux-${arch}.run --install --install-path=${install_path}参数说明:
${soc_name}:表示 NPU 型号名称,即${soc_version}删除 “ascend” 后剩余的内容;${install_path}:表示指定安装路径,需要与 toolkit 包安装在相同路径,默认安装在/usr/local/Ascend目录。
3.4 环境变量配置
# 默认路径安装,以root用户为例(非root用户,将/usr/local替换为${HOME}) source /usr/local/Ascend/cann/set_env.sh # 指定路径安装 # source ${install_path}/cann/set_env.sh安装 CANN 之后,可参考 CANN 官方文档中的依赖列表与安装后操作章节安装其他辅助工具。需要注意,SiP 库编译所需的ASCEND_HOME_PATH等环境即由此步骤提供,构建前务必先加载对应的 CANN 环境。
四、SiP 库编译:从源码到安装包
4.1 下载源码与基本编译
git clone https://gitcode.com/cann/sip.git克隆后可自行选择需要的分支。随后进入仓库根目录执行编译:
cd ${sip_root_path} bash build.sh关于编译过程有几点特别说明:
- 支持范围:上述编译方式仅支持编译通过 git 下载的加速库,以 zip 压缩包方式下载的加速库不支持该编译方式;
- 联网要求:由于编译过程需要联网下载依赖库,因此编译环境需要联网;
- 两个阶段:编译过程包括①获取并编译 ascend-boost-comm(昇腾分布式通信加速库)组件;②编译信号加速库。更多命令介绍可查看仓库根目录 build.sh。
从 build.sh 源码看,首次编译时脚本会自动克隆ascend-boost-comm(master 分支)与catlass两个依赖仓库到3rdparty目录,编译 mki 组件后执行cmake -B build -S .,随后以make -j64并行编译并make install,最终调用 makeself 打包生成 run 安装包。脚本支持的参数还包括:
| 参数 | 说明 |
|---|---|
--help | 显示帮助信息 |
--dev | 仅编译算子库,若 type 为空默认为 dev |
--clean | 清除缓存和依赖的三方库 |
--ut | 编译并执行单元测试用例 |
--output=<dir> | 指定编译输出目录,默认为${repo}/output |
--use_cxx11_abi=0/1 | 设置-D_GLIBCXX_USE_CXX11_ABI,默认 0 |
--verbose | 打印详细的编译命令 |
--mssanitizer | 启用 mssanitizer |
4.2 编译目标芯片架构配置
SiP 库支持多种 Ascend 芯片架构,编译时通过 configs/build_config.json 配置需要编译的目标芯片。该文件内容如下:
{ "targets": { "ascend310b": false, "ascend310p": false, "ascend910b": true, "ascend950": true } }各字段含义说明:
| 芯片架构 | 对应产品系列 |
|---|---|
ascend310b | Atlas 200I/500 A2 推理卡 |
ascend310p | Atlas 300I 推理卡 |
ascend910b | Atlas A2 训练/推理服务器 |
ascend950 | Ascend 950PR/950DT |
将需要编译的目标设置为true,不需要编译的目标设置为false。
重要注意:默认配置同时启用了
ascend910b和ascend950两个目标。若你的运行环境仅支持其中一种芯片(例如仅支持 Ascend910),请将不支持的芯片架构设置为false,否则编译不支持的芯片目标时会因硬件特性不匹配而失败(典型报错如simd_vf function 'RegCompute' must be a free function or static member function)。
除修改项目自带配置文件外,还可通过环境变量BUILD_CONFIG_FILE指定自定义的配置文件路径:
export BUILD_CONFIG_FILE=/path/to/your/build_config.json bash build.sh关于配置读取机制,docs/compilation_build.md 给出了源码级解释:编译系统实际读取的配置文件由 scripts/build_util.py 中的get_build_target_list()函数决定。未设置BUILD_CONFIG_FILE时默认读取项目根目录configs/build_config.json;设置后读取指定路径。项目依赖的 mki 组件虽也带有configs/build_config.json,但 SiP 编译流程以项目自身的配置文件为准,无需修改3rdparty/mki/下的配置。
同时,CANN 版本会影响 A5(ascend950)内核的编译行为:CANN 版本低于 9.1.0 时,即使配置启用了ascend950,也会自动跳过全部 A5 设备内核,主机库和其他已启用架构的内核仍会编译;CANN 9.1.0 及以上版本按原配置编译 A5 内核。配置阶段会打印检测到的 CANN 版本和实际编译的目标架构——版本取自当前ASCEND_HOME_PATH下的include/version/cann_version.h(无法读取时使用compiler/version.info)。当前仓库 version.info 标注的版本为 9.1.0。请求 A5 但无法确定版本,或过滤后没有兼容的设备目标时,配置会报错。
4.3 编译产物与安装
编译完成后,build.sh 会通过 makeself 打包生成Ascend-cann-SIP_${version}_linux_${arch}.run。该文件是包含算子执行所需文件的可执行安装包,通过以下命令安装:
# 确保安装包具有可执行权限 chmod +x Ascend-cann-SIP_${version}_linux_${arch}.run # 安装命令 ./Ascend-cann-SIP_${version}_linux_${arch}.run --install --install-path=${install_path} # 设置加速库环境变量 source ${install_path}/asdsip/set_env.sh编译输出目录(默认output)中的关键文件包括:
output/lib/libasdsip.so:SiP 加速库的动态链接库文件;output/lib/libmki.so:MKI 库的动态链接库文件;scripts/install.sh/scripts/uninstall.sh/scripts/set_env.sh:安装、卸载与环境变量设置脚本;output/version.info:版本信息文件(记录包名、版本、平台、分支与 commit id)。
scripts/set_env.sh 是进程级环境变量设置脚本,source后自动完成环境变量设置,用户进程结束后自动失效。
4.4 编译相关关键文件一览
| 文件 | 作用 |
|---|---|
build.sh | 加速库编译脚本,可设置日志存放目录、日志文件、编译器版本等,一般无需更改 |
scripts/install.sh | 安装脚本 |
scripts/uninstall.sh | 卸载脚本 |
scripts/release.sh | 全自动构建与打包脚本 |
scripts/build_util.py | 编译辅助脚本,负责读取编译目标配置(build_config.json)及算子二进制打包 |
configs/build_config.json | 编译目标芯片架构配置文件 |
configs/op_list.yaml | 算子列表配置 |
五、快速上手:C++ 调用算子示例
SiP 仓库的 example 目录下存放了多个不依赖测试框架、即编即用的算子调用 Demo。以下示例展示通过 C++ 调用 SiPasdBlasSdot算子实现向量点乘(内积)功能,代码完整内容可参考 example/example.cpp,核心内容如下:
int main(int argc, char **argv) { // 设置算子使用的device id int deviceId = 0; //(固定写法)创建执行流 aclrtStream stream; Init(deviceId, &stream); // 创造tensor的Host侧数据 int64_t n = 5; int64_t incx = 1; int64_t incy = 1; int64_t xSize = 5; std::vector<float> tensorInXData; tensorInXData.resize(xSize); for (int64_t i = 0; i < xSize; i++) { tensorInXData[i] = 1.0 + i; } int64_t ySize = 5; std::vector<float> tensorInYData; tensorInYData.resize(xSize); for (int64_t i = 0; i < ySize; i++) { tensorInYData[i] = 10.0 + i; } int64_t resultSize = 1; std::vector<float> resultData; resultData.resize(resultSize); std::cout << "------- input x -------" << std::endl; for (int64_t i = 0; i < xSize; i++) { std::cout << tensorInXData[i] << " "; } std::cout << std::endl; std::cout << "------- input y -------" << std::endl; for (int64_t i = 0; i < ySize; i++) { std::cout << tensorInYData[i] << " "; } std::cout << std::endl; // 创造输入/输出tensor std::vector<int64_t> xShape = {xSize}; std::vector<int64_t> yShape = {ySize}; std::vector<int64_t> resultShape = {resultSize}; aclTensor *inputX = nullptr; aclTensor *inputY = nullptr; aclTensor *result = nullptr; void *inputXDeviceAddr = nullptr; void *inputYDeviceAddr = nullptr; void *resultDeviceAddr = nullptr; CreateAclTensor(tensorInXData, xShape, &inputXDeviceAddr, aclDataType::ACL_FLOAT, &inputX); CreateAclTensor(tensorInYData, yShape, &inputYDeviceAddr, aclDataType::ACL_FLOAT, &inputY); CreateAclTensor(resultData, resultShape, &resultDeviceAddr, aclDataType::ACL_FLOAT, &result); // 创建算子执行句柄 asdBlasHandle handle; asdBlasCreate(handle); // 创造算子执行所需workspace size_t lwork = 0; void *buffer = nullptr; asdBlasMakeDotPlan(handle); asdBlasGetWorkspaceSize(handle, lwork); if (lwork > 0) { aclrtMalloc(&buffer, static_cast<int64_t>(lwork), ACL_MEM_MALLOC_HUGE_FIRST); } asdBlasSetWorkspace(handle, buffer); // 配置算子执行信息 asdBlasSetStream(handle, stream); // 调用接口执行算子(固定调用逻辑) asdBlasSdot(handle, n, inputX, incx, inputY, incy, result); asdBlasSynchronize(handle); // 调用算子后销毁算子句柄 asdBlasDestroy(handle); // 将输出tensor的Device侧数据复制到Host侧内存上 aclrtMemcpy(resultData.data(), resultSize * sizeof(float), resultDeviceAddr, resultSize * sizeof(float), ACL_MEMCPY_DEVICE_TO_HOST); std::cout << "------- result -------" << std::endl; for (int64_t i = 0; i < 1; i++) { std::cout << resultData[i] << " "; } std::cout << std::endl; // 资源释放 aclDestroyTensor(inputX); aclDestroyTensor(inputY); aclDestroyTensor(result); aclrtFree(inputXDeviceAddr); aclrtFree(inputYDeviceAddr); aclrtFree(resultDeviceAddr); if (lwork > 0) { aclrtFree(buffer); } // 调用算子后重置算子使用的deviceId aclrtDestroyStream(stream); aclrtResetDevice(deviceId); aclFinalize(); return 0; }从源码结构看,该示例的调用流程可概括为「acl 初始化 → Host 数据准备 → 通过CreateAclTensor申请 Device 内存并创建aclTensor→ 创建算子句柄 → 查询并设置 workspace → 设置执行流 → 调用asdBlasSdot执行 → 同步并回拷结果 → 释放资源」,这一套「句柄 + Plan + workspace + stream」的调用范式同样适用于 FFT、Filter 等其他算子。
编译与执行:进入 example 目录,执行bash build.sh完成编译和执行:
cd example bash build.sh运行前需先配置好 CANN 环境变量与 SiP 环境变量:
# 配置CANN环境变量(默认安装路径) source /usr/local/Ascend/ascend-toolkit/set_env.sh # 编译SiP并设置加速库环境变量 cd ${SiP_root_path} bash build.sh source output/set_env.sh具体说明可参考 example/README.md。示例中生成的数据不代表实际场景,可根据具体使用场景进行数据修改。
样例安全声明
example目录下的样例旨在提供快速上手、开发和调试 SiP 特性的最小化实现,其核心目标是使用最精简的代码展示 SiP 核心功能,而非提供生产级的安全保障。与成熟的生产级使用方法相比,此样例中的安全功能(如输入校验、边界校验)相对有限。SiP 不推荐用户直接将样例作为业务代码,也不保证此种做法的安全性。若用户将example中的示例代码应用在自身的真实业务场景中且发生了安全问题,则由用户自行承担。
六、日志与环境变量
加速库日志目前已部分适配 CANN 日志,相关环境变量说明可参考 CANN 社区版文档的环境变量参考章节(对应仓库内文档可参见 docs/zh/Installation_Operation_Guide/environment_variable.md 与 docs/zh/Installation_Operation_Guide/security_hardening.md)。日志实现位于 core/utils/include/log 目录,包含日志实体、文件落盘、标准输出等组件,并可通过环境变量控制日志级别与输出行为。
七、自定义算子开发
如果希望基于 SiP 框架开发自己的 NPU 算子,可参考 docs/developing_a_simple_operator.md,该教程以 Conj(共轭)算子为例,说明了完整开发流程:
- 在
core/base目录下新增算子 Host 侧接口文件(如conj.cpp),实现Conj(const Tensor &inTensor, Tensor &outTensor, void *stream, uint8_t *workspace)之类的入口函数,内部构造OpDesc并调用RunAsdOps执行; - 在
ops/base下新增算子目录,存放算子接入 SiP 框架部分以及 tiling 和 kernel 代码(如conj_operation.cpp、conj_kernel.cpp、op_kernel/与tiling/子目录); - 在
ops/include/params/下新增算子参数结构体定义(如 conj.h),供OpDesc的specificParam使用; - 将算子登记进 configs/op_list.yaml,声明其在各芯片架构(
ascend910b/ascend950)上的可用性。
仓库中已有大量可参照的算子实现样例,例如 ops/base/conj、ops/blas/dot、ops/fft 等,可结合 ops/include/params 中的参数定义逐一对照学习。
八、参与贡献
SiP 库欢迎社区开发者参与贡献,流程如下:
- fork 仓库
- 修改并提交代码
- 新建 Pull-Request
详细步骤可参考 docs/contributing_guide.md。
结语
本文以仓库 README.md 为主线,完整梳理了 AscendSiPBoost 从环境准备、CANN 安装、芯片架构配置、源码编译、安装部署到 C++ 算子调用的全链路操作,并深入到了 build.sh、install_deps.sh、configs/build_config.json、example/example.cpp 等源码与配置层面进行印证。基于这套流程,你可以快速在一台搭载 Ascend A2/A3 系列(ascend910b)或 Ascend 950 系列(ascend950)处理器的环境中跑通首个信号处理算子,并进一步沿着「自定义算子开发」章节向 SiP 框架中贡献属于自己的 FFT、BLAS 或融合算子。
【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考