ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CANN SiP 信号处理加速库 SwapOperation 算子实战:asdBlasSswap/asdBlasCswap 完整示例与源码解析

CANN SiP 信号处理加速库 SwapOperation 算子实战:asdBlasSswap/asdBlasCswap 完整示例与源码解析 CANN SiP 信号处理加速库 SwapOperation 算子实战asdBlasSswap/asdBlasCswap 完整示例与源码解析【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库基于华为Ascend AI处理器专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip本文以 SiP信号处理加速库仓库中example/A2/BLAS/swap目录下的 SwapOperation C Demo 为主体完整讲解asdBlasMakeSwapPlan、asdBlasSswap、asdBlasCswap三个接口的功能、参数与约束并继承原 Demo 的完整编译运行流程在此基础上结合core/blas宿主侧实现与ops/blas/swap设备侧 kernel剖析向量交换的校验逻辑、Plan 机制与核内双缓冲数据搬移路径帮助你在 Ascend AI 处理器上完整跑通并深入理解向量交换算子。算子功能与计算公式Swap 算子用于交换两个实复数向量属于 SiP 提供的 BLAS 类基础算子。其计算公式为$$ \begin{aligned} \mathbf{x} \leftrightarrow \mathbf{y} \ x_i \leftrightarrow y_i \quad \text{for } i 1, 2, \dots, n \end{aligned} $$官方 API 文档 Swap 给出了两个接口的具体示例asdBlasSswap实数向量交换输入x为[1.0, 2.0]输入y为[3.0, 4.0]调用后输出x为[3.0, 4.0]输出y为[1.0, 2.0]。asdBlasCswap复数向量交换输入x为[1.0 1.0i, 2.0 2.0i]输入y为[3.0 3.0i, 4.0 4.0i]调用后输出x为[3.0 3.0i, 4.0 4.0i]输出y为[1.0 1.0i, 2.0 2.0i]。接口原型与参数说明Swap 相关的三个接口声明位于 blas_api.hAspbStatus asdBlasMakeSwapPlan(asdBlasHandle handle); AspbStatus asdBlasSswap( asdBlasHandle handle, const int64_t n, aclTensor * x, const int64_t incx, aclTensor * y, const int64_t incy); AspbStatus asdBlasCswap( asdBlasHandle handle, const int64_t n, aclTensor *x, const int64_t incx, aclTensor *y, const int64_t incy);asdBlasMakeSwapPlan初始化该句柄handle对应的 Swap 算子配置是调用交换算子前的必备步骤。参数名输入/输出描述handleasdBlasHandle输入算子的句柄asdBlasSswap / asdBlasCswap共用同一组参数参数名输入/输出描述handleasdBlasHandle输入算子的句柄nint64_t输入向量 x 或者向量 y 中元素的个数xaclTensor *输入/输出对应公式中的 x。asdBlasSswap支持 FLOAT32asdBlasCswap支持 COMPLEX64数据格式支持 NDshape 为 [n]incxint64_t输入x 相邻元素间的内存地址偏移量当前约束为 1yaclTensor *输入/输出对应公式中的 y。类型约束同 xincyint64_t输入y 相邻元素间的内存地址偏移量当前约束为 1接口返回值均为状态码AspbStatus具体返回码含义可参考 SiP返回码。约束说明来自 API 文档的约束条件如下输入和输出数据格式、数据类型、shape 保持一致输入的元素个数 n 当前覆盖支持[1, 6.71e07]约 2^26算子输入 shape 为 [n]、[n]输出 shape 为 [n]、[n]算子实际计算时不支持 ND 高维度运算不支持维度 ≥ 3 的运算。从源码结构看这些约束在宿主侧实现 swap.cpp 中有直接对应asdBlasSswap/asdBlasCswap会用aclGetDataType校验 x、y 必须分别为ACL_FLOAT或ACL_COMPLEX64否则返回ACL_ERROR_UNSUPPORTED_DATA_TYPEn必须满足0 n UINT32_MAX否则返回ACL_ERROR_INVALID_PARAM。此外asdBlasSwapImpl会通过aclGetStorageShape检查 x、y 实际存储元素数与n一致复数场景按实部虚部折算为2*n不一致时返回ACL_ERROR_OP_INPUT_NOT_MATCH。产品支持情况该 Demo 适用于Atlas A2/A3 训练系列产品、Atlas 800I A2 推理产品、Atlas A3 推理系列产品。API 文档中的更细粒度支持矩阵为Atlas A2 训练系列/Atlas A2 推理系列、Atlas A3 训练系列/Atlas A3 推理系列支持Ascend 950PR/950DT、Atlas 200I/500 A2 推理产品、Atlas 推理系列、Atlas 训练系列不支持。请结合实际产品核对。环境配置与编译运行环境配置先配置 CANN 环境变量source [CANN安装路径]/set_env.sh默认为source /usr/local/Ascend/ascend-toolkit/set_env.shSiP 编译进入 SiP 根目录编译信号处理加速库并设置加速库环境变量cd ${SiP_root_path} bash build.sh source output/set_env.sh特别说明来自原 Demo README上述编译方式仅支持编译通过 git 下载的加速库以 zip 压缩包方式下载的加速库不支持该编译方式由于编译过程需要联网下载依赖库因此编译环境需要联网该编译过程包括获取 ascend-boost-comm昇腾分布式通信加速库组件并编译该组件、和编译信号加速库两个步骤。更多编译命令说明请参考 编译与构建。运行 Demo进入示例目录执行构建脚本cd ${示例所在目录} # 即 example/A2/BLAS/swap bash build.sh该目录下的 build.sh 会检查环境变量ASDSIP_HOME_PATH是否已设置若未设置则报错退出并把路径加入LD_LIBRARY_PATH然后用g编译example_sswap.cpp链接libascendcl、libopapi、libnnopbase以及 SiP 的libmki、libasdsip、libasdsip_core、libasdsip_host最后生成并直接运行example可执行文件g example_sswap.cpp \ -I${ASCEND_HOME_PATH}/include/aclnn \ -I${ASCEND_HOME_PATH}/include \ -L${ASCEND_HOME_PATH}/lib64/ -lascendcl -lopapi -lnnopbase \ -I${ASDSIP_HOME_PATH}/include \ -L${ASDSIP_HOME_PATH}/lib -lmki \ -L${ASDSIP_HOME_PATH}/lib -lasdsip \ -L${ASDSIP_HOME_PATH}/lib -lasdsip_core \ -L${ASDSIP_HOME_PATH}/lib -lasdsip_host \ -o example ./example场景说明目录中提供两个示例编译运行时需根据具体场景对应修改 build 脚本example_sswap.cpp默认编译脚本可编译运行该示例。TensorNameDataTypeDataFormatShapexfloat32nd[n]yfloat32nd[n]example_cswap.cpp将编译脚本中的example_sswap.cpp替换为example_cswap.cpp后替换后的编译脚本可编译运行。TensorNameDataTypeDataFormatShapexcomplex64nd[n]ycomplex64nd[n]另外仓库顶层 CMakeLists 中的示例构建同样支持example_sswap.cpp/example_cswap.cppfile(GLOB_RECURSE SOURCE_FILES ...)列表内链接asdsip asdsip_core asdsip_host三个目标库可按需选择构建方式。示例代码解析asdBlasSswap 示例实数向量example_sswap.cpp 以n 8、incx incy 1构造两个全 1、全 2 的 float32 向量。完整主流程如下// 1. ACL 初始化固定写法 auto ret Init(deviceId, stream); // aclInit - aclrtSetDevice - aclrtCreateStream // 2. 构造 host 数据并创建 aclTensor // x [1.0 x 8], y [2.0 x 8]shape 均为 [n]格式 ND ret CreateAclTensor(tensorInXData, xShape, inputXDeviceAddr, aclDataType::ACL_FLOAT, inputX); ret CreateAclTensor(tensorInYData, yShape, inputYDeviceAddr, aclDataType::ACL_FLOAT, inputY); // 3. 创建句柄、生成 Plan、申请并绑定 workspace设置 stream asdBlasHandle handle; asdBlasCreate(handle); size_t lwork 0; void* buffer nullptr; asdBlasMakeSwapPlan(handle); // 初始化 Swap 算子配置 asdBlasGetWorkspaceSize(handle, lwork); // 查询所需 workspace 大小 if (lwork 0) { ret aclrtMalloc(buffer, static_castint64_t(lwork), ACL_MEM_MALLOC_HUGE_FIRST); } asdBlasSetWorkspace(handle, buffer); asdBlasSetStream(handle, stream); // 4. 发起交换 ASD_STATUS_CHECK(asdBlasSswap(handle, n, inputX, incx, inputY, incy)); // 5. 同步并销毁句柄 asdBlasSynchronize(handle); asdBlasDestroy(handle);随后通过aclrtMemcpy把 device 侧结果拷回 host 打印输出可验证 x 变为全 2、y 变为全 1。其中CreateAclTensor辅助函数封装了aclrtMalloc申请 device 内存、aclrtMemcpy拷入数据、按 shape 计算连续 strides、aclCreateTensor创建 ND 格式 tensor 的完整过程见 example_sswap.cpp是 SiP 各 BLAS 示例通用的数据准备模式。asdBlasCswap 示例复数向量example_cswap.cpp 流程与实数版一致差异在于数据类型与规模n 6x、y 均为std::complexfloatACL_COMPLEX64x 全为(2.0, -2.0)y 全为(4.0, -4.0)核心调用改为ASD_STATUS_CHECK(asdBlasCswap(handle, n, inputX, incx, inputY, incy));需要特别说明来自原 Demo README示例中生成的数据不代表实际场景可根据具体使用场景进行数据修改。Plan 机制与源码级细节宿主侧 swap.cpp 中asdBlasMakeSwapPlan会创建BlasSwapPlan并绑定到BlasPlanCache且对 handle 做了重复绑定守卫若该 handle 已绑定 plan再次调用将直接返回ACL_ERROR_INVALID_PARAM防止对已绑定 handle 静默失败导致的资源悬空问题。而asdBlasSwapImpl执行前会检查BlasPlanCache::doesPlanExist(handle)未生成 plan 时返回内部错误——这解释了 Demo 中“必须先asdBlasMakeSwapPlan再调用交换算子”的固定顺序。执行时宿主侧组装OpDescopName 为SwapOperation把 x、y 两个 aclTensor 作为输入 tensor通过RunAsdOpsV2下发到设备侧执行。设备侧 kernel 位于 sswap.cce。从源码结构看sswap_process_aiv在 AIV 核上采用UB 双缓冲ping-pong流水线先在 UB 中划分ub_x_ping/ub_x_pong/ub_y_ping/ub_y_pong四块缓冲每块 20KB按每轮maxDataCount 20*1024/8 2560个 float 分块处理cswap_single_iteration_aiv先并发发起gm_to_ub把 x、y 当前分块搬入各自 UB再通过SET_FLAG/WAIT_FLAG与 MTE2/MTE3 事件做搬运同步最后用ub_to_gm把 ub_x 写回 y、ub_y 写回 x完成交换。Cube 核上定义了空的sswap函数体即该算子仅由 AIV 核承担数据搬移。incx/incy在实现中若传入 ≤ 0 会被修正为 1 并记录日志与 API 文档“当前约束为 1”的说明一致。参考路径汇总内容路径本 Demo 说明文档example/A2/BLAS/swap/README.md实数交换示例example_sswap.cpp复数交换示例example_cswap.cpp示例构建脚本build.sh接口声明blas_api.h宿主侧实现core/blas/swap.cppPlan 类实现core/blas/blasplan/BlasSwapPlan.cpp设备侧 kernel实数ops/blas/swap/sswap/kernel/sswap.cceAPI 参考文档docs/zh/API_Reference/BLAS/Swap.md编译构建指南docs/compilation_build.mdSiP 返回码说明docs/zh/context/SiP返回码.md【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库基于华为Ascend AI处理器专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表