news 2026/9/18 7:34:54

CANN SiP 头文件与库文件完全指南:接口分类、依赖关系与编译链接实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN SiP 头文件与库文件完全指南:接口分类、依赖关系与编译链接实战

CANN SiP 头文件与库文件完全指南:接口分类、依赖关系与编译链接实战

【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip

本文档基于 CANN SiP(Ascend SiP Boost,信号处理算子加速库)官方《头文件和库文件说明》,结合仓库源码与示例工程,系统梳理 AsdSip 接口的六大功能分类、各公开头文件的用途与依赖、主库与第三方依赖库的链接关系,并给出可运行的编译链接与调用实践。读者读完即可正确选择头文件、配置链接参数,完成基于 AsdSip 接口的应用程序开发。

一、接口分类:AsdSip 六大功能模块概览

AsdSip 的所有公开接口统一位于AsdSip命名空间下(FFT 头文件内部同时以extern "C"声明以便 C 语言引用),按功能可分为以下六类。实际开发时可根据接口名前缀快速定位所属模块与对应头文件:

接口名前缀所属模块描述
swapLast2Axes / asdMulBase(基础模块)基础张量操作,包括轴交换、逐元素乘法等。
asdFft*FFT(快速傅里叶变换模块)FFT/STFT/ISTFT 变换,支持 1D/2D/3D,支持 C2C、C2R、R2C 类型。
asdBlas*BLAS(线性代数模块)BLAS Level 1/2/3 操作,包括矩阵乘法、向量运算、三角求解等,支持实数和复数类型。
asdConvolve*Filter(滤波器模块)一维卷积操作,支持 full/same/valid 三种模式。
asdInterp*Interpolation(插值模块)基于系数的插值操作。
rs*Domain(领域模块)面向雷达信号处理等特定领域的专用接口,如 Sinc 插值。

从仓库目录结构可以印证这一分类:include/下直接放置了base_api.hblas_api.hfft_api.hfilter_api.hinterp_api.h,而领域接口单独放在include/domain/rs_api.hexample/A2/目录同样按BASE/BLAS/FFT/Domain/Filter/Interpolation/分目录组织示例代码,便于按模块检索。

二、头文件说明:从总入口到模块级头文件

编译 AsdSip 接口程序时,需根据实际使用的接口 include 对应的头文件。头文件位于安装目录的include/下(构建源码时对应仓库根目录的 include/ 目录)。各头文件的用途、内部依赖与对应库文件如下表:

头文件用途对应的库文件
asdsip.h总入口头文件,聚合所有公开 API 头文件。用户只需#include "asdsip.h"即可使用全部接口。内部依次 include base_api.h、blas_api.h、fft_api.h、filter_api.h、interp_api.h 和 domain/rs_api.h。libasdsip.so 或 libasdsip_static.a
base_api.h基础操作接口。定义轴交换(swapLast2Axes)、逐元素乘法(asdMul)等基础张量操作。依赖 utils/aspb_status.h 和 utils/mem_base.h。libasdsip.so 或 libasdsip_static.a
fft_api.hFFT 快速傅里叶变换接口。定义 FFT Handle 管理(asdFftCreate/Destroy)、流绑定(asdFftSetStream)、1D/2D/3D 计划创建(asdFftMakePlan1D/2D/3D)、ISTFT 计划创建(asdFftIstftMakePlan)、执行接口(asdFftExecC2C/C2R/R2C/C2CSeparated/Istft)、Workspace 管理(asdFftGetWorkspaceSize/SetWorkspace)、同步(asdFftSynchronize)等。同时定义 asdFftType、asdFftDirection、asdFft1dDimType 等枚举类型。libasdsip.so 或 libasdsip_static.a
blas_api.hBLAS 线性代数接口。定义 BLAS Handle 管理(asdBlasCreate/Destroy)、流绑定(asdBlasSetStream)、计划创建(MakeXxxPlan 系列)、Workspace 管理、同步等。提供的 BLAS 操作包括:矩阵乘法(Cgemm、CgemmBatched、HCgemmBatched)、矩阵向量乘(Cgemv、CgemvBatched、HCgemvBatched)、三角矩阵求解(Strmv、Ctrmv)、矩阵三角乘(Strmm)、秩一更新(Cgerc)、向量点积(Sdot、Cdotu、Cdotc)、向量范数(Snrm2、Scnrm2)、向量绝对值求和(Sasum、Scasum)、向量缩放(Sscal、Cscal、Csscal)、向量拷贝(Scopy、Ccopy)、向量交换(Sswap、Cswap)、向量线性组合(Caxpy)、Givens 旋转(Csrot)、矩阵求逆(CmatinvBatched、HCmatinvBatched)、列向量乘(ColwiseMul)、复矩阵点积(ComplexMatDot)、最大绝对值索引(Isamax、Icamax)等。同时定义 asdBlasStatus、asdBlasSideMode_t、asdBlasOperation_t、asdBlasFillMode_t、asdBlasDiagType_t 等枚举类型。依赖 acl/acl.h 和 aclnn/opdev/fp16_t.h。libasdsip.so 或 libasdsip_static.a
filter_api.h滤波器/卷积接口。定义一维卷积操作(asdConvolve)及其 Workspace 大小查询(asdConvolveGetWorkspaceSize)。支持 ASD_CONVOLVE_FULL、ASD_CONVOLVE_SAME、ASD_CONVOLVE_VALID 三种卷积模式(asdConvolveMode_t 枚举)。libasdsip.so 或 libasdsip_static.a
interp_api.h插值接口。定义基于系数的插值操作(asdInterpWithCoeff)及其 Workspace 大小查询(asdInterpWithCoeffGetWorkspaceSize)。libasdsip.so 或 libasdsip_static.a
domain/rs_api.h雷达信号处理领域接口。定义 Sinc 插值操作(rsInterpolationBySinc)及其 Workspace 大小查询(rsInterpolationBySincGetWorkspaceSize),面向雷达信号处理场景。libasdsip.so 或 libasdsip_static.a

2.1 总入口头文件 asdsip.h 的聚合机制

从源码看,asdsip.h 的完整实现非常简洁:它不定义任何接口,只通过预处理指令依次引入六个模块头文件:

#include "base_api.h" #include "blas_api.h" #include "fft_api.h" #include "filter_api.h" #include "interp_api.h" #include "domain/rs_api.h"

因此,工程实践中一般建议直接包含总入口头文件asdsip.h,一次获得全部接口;若仅使用某个模块(例如只用 FFT 接口),也可只包含对应模块头文件以减小预处理面,但链接目标库不变(均为 libasdsip.so 或 libasdsip_static.a)。

2.2 头文件之间的依赖关系

  • 状态码依赖:所有模块头文件都依赖 utils/aspb_status.h,接口返回值统一使用AsdSip::AspbStatus状态类型(FFT 接口内部也定义了asdFftStatus枚举:SUCCESS = 0FAILED = 1)。
  • 张量类型依赖:Base/BLAS/Filter/Interpolation/Domain 头文件均依赖 utils/mem_base.h 与acl/acl.h,接口的输入输出张量统一使用aclTensor *类型(由 Ascend CL 运行时库 libascendcl.so 提供)。
  • BLAS 特有依赖:blas_api.h 额外依赖aclnn/opdev/fp16_t.h(来自 Ascend NN 算子库 libaclnn.so),因此 BLAS 模块对 CANN 的 aclnn 头文件有依赖;FFT 头文件则通过前置声明typedef struct aclTensor aclTensor;弱化了对 acl 头文件的直接依赖。

2.3 关键枚举与数据类型的取值约定

结合源码可将文档中提到的枚举补充完整,供参数校验参考:

  • FFT 类型(asdFftType):ASCEND_FFT_C2C = 0x10ASCEND_FFT_C2R = 0x11ASCEND_FFT_R2C = 0x12ASCEND_STFT_C2C = 0x20ASCEND_STFT_C2R = 0x21ASCEND_STFT_R2C = 0x22ASCEND_FFT_C2C_SEP = 0x30(分离实部/虚部的 C2C,对应asdFftExecC2CSeparated)。
  • FFT 方向(asdFftDirection):ASCEND_FFT_FORWARD = 0x10ASCEND_FFT_INVERSE = 0x11
  • FFT 一维维度类型(asdFft1dDimType):ASCEND_FFT_HORIZONTAL = 0x10ASCEND_FFT_VERTICAL = 0x11,且asdFftMakePlan1D中该参数有默认值 HORIZONTAL。
  • BLAS 枚举asdBlasStatus(BLAS_SUCCESS/BLAS_FAILED)、asdBlasSideMode_t(ASDBLAS_SIDE_LEFT/ASDBLAS_SIDE_RIGHT)、asdBlasOperation_t(ASDBLAS_OP_N/OP_T/OP_C,对应不转置/转置/共轭转置)、asdBlasFillMode_t(ASDBLAS_FILL_MODE_LOWER/UPPER/FULL)、asdBlasDiagType_t(ASDBLAS_DIAG_NON_UNIT/UNIT)。
  • 卷积模式(asdConvolveMode_t):ASD_CONVOLVE_FULL = 0ASD_CONVOLVE_SAME = 1ASD_CONVOLVE_VALID = 2

三、库文件说明:主用户库、核心运行时库与第三方依赖

构建完成并执行安装后,库文件位于安装目录的lib/下。仓库根 CMakeLists.txt 中通过install(FILES ... DESTINATION lib)将 MKI 库一并安装到lib/目录,安装布局与文档描述一致。

3.1 AsdSip 自有库文件

库文件类型说明
libasdsip.so动态库(共享库)主用户库。聚合 utils、base、blas、fft、filter、interpolation 全部模块,链接 libasdsip_core.so。用户应用程序应链接此库以使用 AsdSip 全部公开接口。
libasdsip_static.a静态库主用户库(静态版本)。功能与 libasdsip.so 相同,适用于需要静态链接的场景。链接时需额外链接 libasdsip_core.so。
libasdsip_core.so动态库(共享库)算子核心运行时库。包含算子注册、Kernel 加载与调度(Ops 单例)、tiling 逻辑等。内部链接 MKI 静态库(libmki_static.a)和 Ascend CANN 算子编译框架库。由 libasdsip.so 自动依赖,用户通常无需单独引用。
libasdsip_host.so动态库(共享库)主机端工具库。包含算子参数处理等主机端辅助功能,依赖 ops_utils 模块。

3.2 第三方依赖库

以下库文件由 CANN 软件包或 MKI 框架提供,编译和运行时需确保其在链接路径中可用:

库文件来源说明
libmki.so / libmki_static.aMKI 框架(3rdparty/mki)MKI 内核抽象框架库。提供 Tensor、Kernel、Operation 等核心抽象,以及运行时调度能力。libasdsip_core.so 在发布模式下静态链接 libmki_static.a,在测试模式下动态链接 libmki.so。
libascendcl.soCANN 软件包($ASCEND_HOME_PATH/lib64)Ascend CL 运行时库。提供 aclTensor 等基础数据类型和设备管理、内存管理、Stream 管理等运行时接口。AsdSip 公开头文件中引用了 acl/acl.h。
libaclnn.soCANN 软件包($ASCEND_HOME_PATH/lib64)Ascend NN 算子库。提供 aclnn 系列算子接口,BLAS 模块中部分操作依赖 aclnn 头文件(aclnn/opdev/fp16_t.h、acl/acl_meta.h 等)。

链接注意点:使用动态库时只需链接-lasdsip(其自动依赖 libasdsip_core.so,并间接携带 libmki 与 CANN 算子编译框架库);使用静态库 libasdsip_static.a 时,由于静态链接不会自动传递依赖,需要显式追加链接 libasdsip_core.so 以及 CANN 的 libascendcl.so、libaclnn.so 等运行时库。

四、编译链接实战:以仓库示例工程为模板

仓库 example/CMakeLists.txt 给出了标准链接配置,可以直接作为用户工程的模板:

add_executable(Sample ${SOURCE_FILES}) target_link_libraries(Sample PUBLIC asdsip asdsip_core asdsip_host) include_directories( $ENV{ASCEND_HOME_PATH}/include $ENV{ASCEND_HOME_PATH}/include/aclnn ) target_link_libraries(Sample PUBLIC asdsip asdsip_core asdsip_host $ENV{ASCEND_HOME_PATH}/lib64/libascendcl.so $ENV{ASCEND_HOME_PATH}/lib64/libnnopbase.so $ENV{ASCEND_HOME_PATH}/lib64/libopapi.so )

要点解读:

  1. 头文件搜索路径:除 AsdSip 安装目录的include/外,还需将$ASCEND_HOME_PATH/include$ASCEND_HOME_PATH/include/aclnn加入include_directories,以满足acl/acl.hacl_meta.haclnn/opdev/fp16_t.h等 CANN 头文件的解析。
  2. 链接目标:示例同时链接asdsipasdsip_coreasdsip_host三个目标。其中asdsip是主用户库;asdsip_core提供算子注册与 Kernel 调度;asdsip_host提供主机端参数处理。从源码结构看,三者对应 libasdsip.so、libasdsip_core.so、libasdsip_host.so。
  3. CANN 运行时库:显式链接 libascendcl.so(设备/内存/Stream 管理)、libnnopbase.so 与 libopapi.so(算子底座),这些库位于$ASCEND_HOME_PATH/lib64
  4. 环境变量:CMake 配置阶段依赖ASCEND_HOME_PATH环境变量(见仓库根 CMakeLists.txt 中的include_directorieslink_directories),编译前需确保已配置 CANN 环境,例如执行source set_env.sh或安装目录下的环境初始化脚本。

五、典型调用流程:从头文件到库的完整落地

以仓库 example/example.cpp 为例,一个 AsdSip 程序的完整调用链如下,可验证头文件与库的使用方式:

  1. 包含头文件#include "asdsip.h"(总入口,聚合全部接口),并包含acl/acl.hacl_meta.h用于 acl 初始化与张量创建。
  2. 初始化 Ascend 环境:依次调用aclInit(nullptr)aclrtSetDevice(deviceId)aclrtCreateStream(stream),获得执行 Stream。
  3. 准备张量:通过aclrtMalloc申请设备侧内存、aclrtMemcpy拷贝 Host 数据,再调用aclCreateTensor(shape, shapeSize, dataType, strides, ...)创建aclTensor *作为接口输入输出(上述过程对应示例中的CreateAclTensor模板函数)。
  4. 调用 AsdSip 接口:在AsdSip命名空间下调用对应算子接口;对需要 Handle 的模块(FFT/BLAS)遵循"Create → SetStream → MakePlan → GetWorkspaceSize/SetWorkspace → Exec → Synchronize → Destroy"的典型生命周期。
  5. 链接运行:按第四节方式链接 libasdsip.so 及 CANN 运行时库,运行前将安装目录的lib/$ASCEND_HOME_PATH/lib64加入LD_LIBRARY_PATH

仓库 example/ 目录下的各模块示例(如 example/A2/BLAS/cgemm/example_cgemm.cpp、example/A2/FFT/1d/example_acl_fft_c2c_1d.cpp)以及 tests/ut/unittest/ 下的单测代码,均遵循上述模式,可作为编写首个 AsdSip 程序的参考。

六、小结

正确使用 AsdSip 库的关键在于三点:一是按接口前缀确认所属模块并选择对应头文件(或直接使用asdsip.h总入口);二是理解 libasdsip.so(主用户库)、libasdsip_core.so(算子核心运行时)、libasdsip_host.so(主机端工具库)的分工与依赖关系;三是编译时同时配置 AsdSip 安装目录头文件与 CANN 头文件,链接时按动态/静态两种方式补齐 CANN 运行时库。结合仓库示例工程与本文的链接配置,即可快速搭建可运行的 AsdSip 应用程序。

【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库,基于华为Ascend AI处理器,专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 7:34:25

猫抓 cat-catch:网页资源嗅探扩展,3 步把网页视频存进本地

猫抓 cat-catch:网页资源嗅探扩展,3 步把网页视频存进本地 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 刷到想存的网页视…

作者头像 李华
网站建设 2026/9/18 7:32:52

CNN多变量时序预测实战:基于MATLAB的数据预处理到应用部署

简介:一份基于MATLAB与卷积神经网络(CNN)的多变量时序预测完整项目实例,主要面向具备一定MATLAB编程和深度学习基础、从事智能预测系统开发的1-5年经验算法工程师与数据分析从业者,旨在解决电力负荷、工业监测、交通流…

作者头像 李华
网站建设 2026/9/18 7:31:49

RS485与Modbus RTU在机器人电动快换模块通信中的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华