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 / asdMul | Base(基础模块) | 基础张量操作,包括轴交换、逐元素乘法等。 |
| 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.h、blas_api.h、fft_api.h、filter_api.h、interp_api.h,而领域接口单独放在include/domain/rs_api.h;example/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.h | FFT 快速傅里叶变换接口。定义 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.h | BLAS 线性代数接口。定义 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 = 0、FAILED = 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 = 0x10、ASCEND_FFT_C2R = 0x11、ASCEND_FFT_R2C = 0x12、ASCEND_STFT_C2C = 0x20、ASCEND_STFT_C2R = 0x21、ASCEND_STFT_R2C = 0x22、ASCEND_FFT_C2C_SEP = 0x30(分离实部/虚部的 C2C,对应asdFftExecC2CSeparated)。 - FFT 方向(asdFftDirection):
ASCEND_FFT_FORWARD = 0x10、ASCEND_FFT_INVERSE = 0x11。 - FFT 一维维度类型(asdFft1dDimType):
ASCEND_FFT_HORIZONTAL = 0x10、ASCEND_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 = 0、ASD_CONVOLVE_SAME = 1、ASD_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.a | MKI 框架(3rdparty/mki) | MKI 内核抽象框架库。提供 Tensor、Kernel、Operation 等核心抽象,以及运行时调度能力。libasdsip_core.so 在发布模式下静态链接 libmki_static.a,在测试模式下动态链接 libmki.so。 |
| libascendcl.so | CANN 软件包($ASCEND_HOME_PATH/lib64) | Ascend CL 运行时库。提供 aclTensor 等基础数据类型和设备管理、内存管理、Stream 管理等运行时接口。AsdSip 公开头文件中引用了 acl/acl.h。 |
| libaclnn.so | CANN 软件包($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 )要点解读:
- 头文件搜索路径:除 AsdSip 安装目录的
include/外,还需将$ASCEND_HOME_PATH/include与$ASCEND_HOME_PATH/include/aclnn加入include_directories,以满足acl/acl.h、acl_meta.h、aclnn/opdev/fp16_t.h等 CANN 头文件的解析。 - 链接目标:示例同时链接
asdsip、asdsip_core、asdsip_host三个目标。其中asdsip是主用户库;asdsip_core提供算子注册与 Kernel 调度;asdsip_host提供主机端参数处理。从源码结构看,三者对应 libasdsip.so、libasdsip_core.so、libasdsip_host.so。 - CANN 运行时库:显式链接 libascendcl.so(设备/内存/Stream 管理)、libnnopbase.so 与 libopapi.so(算子底座),这些库位于
$ASCEND_HOME_PATH/lib64。 - 环境变量:CMake 配置阶段依赖
ASCEND_HOME_PATH环境变量(见仓库根 CMakeLists.txt 中的include_directories与link_directories),编译前需确保已配置 CANN 环境,例如执行source set_env.sh或安装目录下的环境初始化脚本。
五、典型调用流程:从头文件到库的完整落地
以仓库 example/example.cpp 为例,一个 AsdSip 程序的完整调用链如下,可验证头文件与库的使用方式:
- 包含头文件:
#include "asdsip.h"(总入口,聚合全部接口),并包含acl/acl.h与acl_meta.h用于 acl 初始化与张量创建。 - 初始化 Ascend 环境:依次调用
aclInit(nullptr)、aclrtSetDevice(deviceId)、aclrtCreateStream(stream),获得执行 Stream。 - 准备张量:通过
aclrtMalloc申请设备侧内存、aclrtMemcpy拷贝 Host 数据,再调用aclCreateTensor(shape, shapeSize, dataType, strides, ...)创建aclTensor *作为接口输入输出(上述过程对应示例中的CreateAclTensor模板函数)。 - 调用 AsdSip 接口:在
AsdSip命名空间下调用对应算子接口;对需要 Handle 的模块(FFT/BLAS)遵循"Create → SetStream → MakePlan → GetWorkspaceSize/SetWorkspace → Exec → Synchronize → Destroy"的典型生命周期。 - 链接运行:按第四节方式链接 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),仅供参考