
SiP 信号处理加速库 FFT 3D Demo 实战asdFftMakePlan3D 与 C2C/C2R/R2C/C2CSep 四类三维变换场景【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库基于华为Ascend AI处理器专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip本篇基于 SiPCANN 信号处理加速库仓库中example/A2/FFT/3d/目录的 C Demo 文档展开讲解如何在 Ascend 平台上配置环境、编译 SiP 库并运行批量三维快速傅里叶变换3D FFT示例。读完后你可以掌握asdFftCreate→asdFftMakePlan3D→asdFftGetWorkspaceSize/asdFftSetWorkspace→asdFftSetStream→ 执行接口这一完整调用链并理解 C2C、C2R、R2C、C2C_SEP 四种变换类型的输入输出形状、数据类型与约束条件。一、功能说明三维离散傅里叶变换的数学定义该目录下为信号处理加速库 FFT 3D Operation 的 C 调用示例见 README。算子功能为执行批量 3D 快速傅里叶变换其数学定义如下。设有一个三维离散信号它的三维离散傅里叶变换定义为其中从公式可以看出3D FFT 是对信号在三个维度长度分别为 Nx、Ny、Nz上的联合频域变换Demo 中的batch维度则允许一次提交多份独立信号做批处理这正是asdFftMakePlan3D最后一个参数batchSize的含义。二、环境配置与 SiP 库编译2.1 配置 CANN 环境变量运行任何 SiP Demo 前需要先加载 CANN 运行环境source [CANN安装路径]/set_env.sh # 默认安装路径下为 source /usr/local/Ascend/ascend-toolkit/set_env.sh2.2 编译 SiP 加速库进入 SiP 仓库根目录执行如下指令编译信号处理加速库并设置加速库环境变量cd ${SiP_root_path} bash build.sh source output/set_env.sh特别说明来自原文档上述编译方式仅支持通过 git 下载的加速库以 zip 压缩包方式下载的加速库不支持该编译方式编译过程需要联网下载依赖库因此编译环境必须联网该编译过程包括获取 ascend-boost-comm昇腾分布式通信加速库组件并编译该组件以及编译信号加速库两个步骤。更多命令介绍可查看 SiP 仓库的 build.sh 文件。更多编译命令与参数说明可参考 编译与构建。从该文档可知bash build.sh是基本编译命令可通过--help参数查看脚本功能及对应指令编译系统实际读取的配置文件由 scripts/build_util.py 中的get_build_target_list()函数决定默认读取项目根目录下的 configs/build_config.json也可通过BUILD_CONFIG_FILE环境变量指定其他配置。2.3 运行 Demo进入示例所在目录并执行构建脚本cd ${示例所在目录} # 本 Demo 即 example/A2/FFT/3d bash build.shexample/A2/FFT/3d/目录下自带 build.sh该脚本与示例源码同目录。示例的 CMake 构建会将可执行程序链接asdsip、asdsip_core、asdsip_host库以及 CANN 的libascendcl.so、libnnopbase.so、libopapi.so参见 example/CMakeLists.txt因此必须先完成 2.2 节的 SiP 编译并source output/set_env.sh示例目录的 build.sh 才能找到这些库。三、核心 API 一览四个 Demo 共用同一套 FFT 接口声明于 include/fft_api.h接口文档见 FFT_3D 参考。// 创建句柄仅分配基本数据结构不初始化 AsdSip::AspbStatus asdFftCreate(asdFftHandle handle); // 初始化三维 FFT 配置一个 handle 只能初始化一次 AspbStatus asdFftMakePlan3D(asdFftHandle handle, int64_t fftSizeX, int64_t fftSizeY, int64_t fftSizeZ, asdFftType fftType, asdFftDirection direction, int32_t batchSize); // 执行各类型变换 AsdSip::AspbStatus asdFftExecC2C(asdFftHandle handle, const aclTensor *input, const aclTensor *output); AsdSip::AspbStatus asdFftExecC2R(asdFftHandle handle, const aclTensor *input, const aclTensor *output); AsdSip::AspbStatus asdFftExecR2C(asdFftHandle handle, const aclTensor *input, const aclTensor *output); AsdSip::AspbStatus asdFftExecC2CSeparated(asdFftHandle handle, const aclTensor *inputReal, const aclTensor *inputImag, const aclTensor *outputReal, const aclTensor *outputImag); // workspace 与流绑定、销毁 AsdSip::AspbStatus asdFftGetWorkspaceSize(asdFftHandle handle, size_t workspaceSize); AsdSip::AspbStatus asdFftSetWorkspace(asdFftHandle handle, void *workspace); AsdSip::AspbStatus asdFftSetStream(asdFftHandle handle, void *stream); AsdSip::AspbStatus asdFftDestroy(asdFftHandle handle);asdFftMakePlan3D的参数含义与公式符号对应参数名类型描述handleasdFftHandle算子句柄需手动调用asdFftCreate创建fftSizeXint64_t对应公式中的 NxFFT 信号长度第一维fftSizeYint64_t对应公式中的 NyFFT 信号长度第二维fftSizeZint64_t对应公式中的 NzFFT 信号长度第三维fftTypeasdFftType变换类型ASCEND_FFT_C2C复数到复数、ASCEND_FFT_C2R复数到实数、ASCEND_FFT_R2C实数到复数、ASCEND_FFT_C2C_SEP复数到复数的分离式变换directionasdFftDirectionASCEND_FFT_FORWARD正向变换 /ASCEND_FFT_INVERSE逆向变换batchSizeint32_t批处理中的数据批次数量各接口返回AspbStatus状态码详见 SiP 返回码。约束说明来自 API 文档fftSizeX、fftSizeY、fftSizeZ需保证不超过 $2^{27}$且分解质因数后不包含超过 199 的质因子batchSize在存储允许范围内无额外约束输入元素个数理论支持 [1, $2^{30}$]输入元素不支持 inf、-inf 和 nan若包含这些值结果为未定义asdFftExecC2CSeparated的信号长度范围为[2, 256]。这些约束直接解释了示例中信号尺寸的取值例如 C2C 示例采用256×64×64C2R 示例采用2×128×128均为 2 的幂次质因子约束自然满足C2C_SEP 示例采用4×4×4且源码中保留了256×256×256的备选配置受 [2,256] 长度限制约束。四、四个示例场景详解README 为每个场景文件给出了输入/输出 Tensor 约定编译运行时需按场景修改 build 脚本默认脚本编译 C2C 场景其余场景将脚本中的example_acl_fft_c2c_3d.cpp替换为对应文件即可。4.1 example_acl_fft_c2c_3d.cpp复数到复数 3D FFT注默认编译脚本可编译运行该示例。输入TensorNameDataTypeDataFormatShapeValuefftTypeasdFftTypend[1]ASCEND_FFT_C2Cinputcomplex64nd[batch, Nfft1, Nfft2, Nfft3]-输出TensorNameDataTypeDataFormatShapeValueoutcomplex64nd[batch, Nfft1, Nfft2, Nfft3]-在 example_acl_fft_c2c_3d.cpp 中信号尺寸设为batch1, Nfft1256, Nfft264, Nfft364Host 侧构造std::complexfloat(i, i1)的测试数据核心调用为L112-L128asdFftHandle handle; asdFftCreate(handle); asdFftMakePlan3D(handle, Nfft1, Nfft2, Nfft3, asdFftType::ASCEND_FFT_C2C, asdFftDirection::ASCEND_FFT_FORWARD, batch); size_t work_size; asdFftGetWorkspaceSize(handle, work_size); void* workspaceAddr nullptr; if (work_size 0) { ret aclrtMalloc(workspaceAddr, static_castint64_t(work_size), ACL_MEM_MALLOC_HUGE_FIRST); // ... 错误检查 ... } asdFftSetWorkspace(handle, (uint8_t*)workspaceAddr); asdFftSetStream(handle, stream); ASD_STATUS_CHECK(asdFftExecC2C(handle, input, out));4.2 example_acl_fft_c2r_3d.cpp复数到实数 3D FFT注将编译脚本中的example_acl_fft_c2c_3d.cpp替换为example_acl_fft_c2r_3d.cpp后即可编译运行。输入TensorNameDataTypeDataFormatShapeValuefftTypeasdFftTypend[1]ASCEND_FFT_C2Rinputcomplex64nd[batch, Nfft1, Nfft2, Nfft3 / 2 1]-输出TensorNameDataTypeDataFormatShapeValueoutfloat32nd[batch, Nfft1, Nfft2, Nfft3]-从 example_acl_fft_c2r_3d.cpp 可以看到单边one-sided频谱的形状规则落在最后一维inSignal Nfft3 / 2 1即输入第三维只需给出 $N_{fft3}/21$ 个复数频率分量变换后恢复为 $N_{fft3}$ 个实数采样。示例取batch2, Nfft12, Nfft2128, Nfft3128输入 Tensor 为ACL_COMPLEX64输出 Tensor 为ACL_FLOAT执行接口为asdFftExecC2R。4.3 example_acl_fft_r2c_3d.cpp实数到复数 3D FFT注将编译脚本中的example_acl_fft_c2c_3d.cpp替换为example_acl_fft_r2c_3d.cpp后即可编译运行。输入TensorNameDataTypeDataFormatShapeValuefftTypeasdFftTypend[1]ASCEND_FFT_R2Cinputfloat32nd[batch, Nfft1, Nfft2, Nfft3]-输出TensorNameDataTypeDataFormatShapeValueoutcomplex64nd[batch, Nfft1, Nfft2, Nfft3 / 2 1]-example_acl_fft_r2c_3d.cpp 取batch1, Nfft11, Nfft264, Nfft332输入为float32实数信号输出为complex64最后一维收敛到Nfft3 / 2 1 17。这与 C2R 示例互为对偶实数到复数变换利用实数信号的共轭对称性输出只保留单边频谱。执行接口为asdFftExecR2C。4.4 example_acl_fft_c2c_3d_sep.cpp实部/虚部分离的 3D FFT注将编译脚本中的example_acl_fft_c2c_3d.cpp替换为example_acl_fft_c2c_3d_sep.cpp后即可编译运行。输入TensorNameDataTypeDataFormatShapeValuefftTypeasdFftTypend[1]ASCEND_FFT_C2C_SEPinputfloat32nd[batch, Nfft1, Nfft2, Nfft3]-输出TensorNameDataTypeDataFormatShapeValueoutcomplex64nd[batch, Nfft1, Nfft2, Nfft3]-C2C_SEP 面向实部、虚部分块存放的数据布局执行接口asdFftExecC2CSeparated接收 4 个独立 Tensor——inputReal、inputImag、outputReal、outputImag。从 example_acl_fft_c2c_3d_sep.cpp 源码看四个 Tensor 均为ACL_FLOAT实部与虚部各自按[batch, Nfft1, Nfft2, Nfft3]形状连续存放示例使用std::uniform_real_distribution(0.0f, 1.0f)生成随机测试数据并在结果回传后分别打印 real part、imag part 以及 workspace 内容用于调试比对。源码注释中还保留了256×256×256等更大尺寸的备选配置// core dd。五、Demo 公共代码结构剖析四个示例共享相同的骨架以 example_acl_fft_c2c_3d.cpp 的main为例可拆解为五步AscendCL 初始化L48-L58aclInit(nullptr)→aclrtSetDevice(deviceId)→aclrtCreateStream(stream)这是所有 ACL 程序的固定写法Demo 中 deviceId 固定取 0构造 Device 侧 TensorL60-L82 的CreateAclTensor模板函数先aclrtMallocACL_MEM_MALLOC_HUGE_FIRST策略申请 device 内存并aclrtMemcpy拷入 Host 数据再按形状计算连续 Tensor 的 strides末维 stride 为 1前维 stride 为后续各维长度之积最后aclCreateTensor创建ACL_FORMAT_ND格式的 aclTensor。3D FFT 输入输出均为 ND 格式strides 必须与 shape 的连续内存布局严格一致创建 handle 并配置 planasdFftCreate→asdFftMakePlan3D指定三个信号长度、变换类型、方向、batch。注意头文件注释强调asdFftCreate只创建不透明句柄真正的初始化发生在 MakePlan 阶段且一个 handle 只能初始化一次workspace 与 stream 配置后执行asdFftGetWorkspaceSize查询所需临时内存大小按需aclrtMalloc并通过asdFftSetWorkspace绑定work_size 为 0 时可跳过分配asdFftSetStream绑定计算流随后调用对应的asdFftExec*接口。FFT 是异步提交到 stream 的因此执行后需aclrtSynchronizeStream(stream)等待完成结果回传与资源释放aclrtMemcpy把输出拷回 Host 并打印前 16 个元素随后依次aclDestroyTensor、aclrtFree输入/输出及 workspace、aclrtDestroyStream、aclrtResetDevice、aclFinalize完成资源回收。返回值检查方面Demo 使用CHECK_RET/ASD_STATUS_CHECK两个宏统一处理 ACL 与 SiP 状态码其中ASD_STATUS_CHECK判断AsdSip::ErrorType::ACL_SUCCESS注意示例文档中的最小化版本失败时exit(-1)而仓库示例源码中为return -1两者均非生产级写法。六、产品支持情况与注意事项产品支持本 Demo 适用于 Atlas A2/A3 训练系列产品、Atlas 800I A2 推理产品、Atlas A3 推理系列产品见 README 的产品支持情况一节。示例数据的局限性示例中 Host 侧生成的数据如complexfloat(i, i1)或随机数不代表实际业务场景仅用于打通编译—运行—取回结果的链路接入真实数据时应按实际信号替换生成逻辑并自行校验数值正确性。编译前提build.sh方式仅支持 git 拉取的源码仓库且需联网示例编译依赖 SiP 库已编译完成并通过source output/set_env.sh注入的库路径。示例代码定位按 FFT_3D API 文档 的说明这些样例旨在提供快速上手、开发和调试算子的最小化实现核心目标是用最精简的代码展示算子功能而非提供生产级的安全保障不推荐直接作为业务代码。七、小结example/A2/FFT/3d/这组 Demo 以四个场景文件覆盖了 3D FFT 的全部变换形态C2C 保持复数形状不变、R2C/C2R 利用单边频谱在最后一维完成 $N \leftrightarrow N/21$ 的映射、C2C_SEP 适配实部虚部分离的内存布局。四类场景共享同一条Create → MakePlan3D → GetWorkspaceSize/SetWorkspace → SetStream → Exec → Synchronize → Destroy调用链差异仅在于 MakePlan 的fftType、Exec 接口以及输入/输出 Tensor 的数据类型与形状约定。理解了本文的调用链与约束尺寸质因子不超过 199、C2C_SEP 信号长度 [2,256]、输入不含 inf/nan即可将这套模式套用到你自己的三维信号频域处理场景中。【免费下载链接】sip本项目是CANN提供的一款高效、可靠的高性能信号处理算子加速库基于华为Ascend AI处理器专门为信号处理领域而设计。项目地址: https://gitcode.com/cann/sip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考