news 2026/5/10 6:14:15

CANN ops-fft算子开发指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN ops-fft算子开发指南

算子开发指南

【免费下载链接】ops-fftops-fft 是 CANN (Compute Architecture for Neural Networks)算子库中提供 FFT 类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。项目地址: https://gitcode.com/cann/ops-fft

目录结构

开发一个算子需要以下文件:

${op_name}/ # 算子名的小写下划线形式 ├── CMakeLists.txt # 算子编译配置文件 ├── ${op_name}_kernel.cpp # Kernel实现文件(可自定义文件名) ├── ${op_name}_host.cpp # Host侧代码(可自定义文件名) ├── arch35/ # Ascend950特有实现 │ └── ${op_name}_struct.h # 算子结构定义(可自定义文件名) └── tests/ # 测试用例目录 ├── ${op_name}_test.cpp # 算子测试用例 └── ${op_name}_test.h # 测试头文件

说明

  • Host 和 Kernel 可以合并为一个.cpp文件
  • TilingData 可以定义在.cpp文件中,也可以独立为_struct.h
  • arch35/目录仅在需要区分不同 SOC 架构时使用
  • 测试文件强烈推荐,但不是必需的

文件说明

1. Host + Kernel 实现

文件<op_name>.cpp

作用

  • Host 部分:实现对外接口、Tiling 计算、内存管理、核函数调用
  • Kernel 部分:实现实际的核函数逻辑

基本结构

#include "acl/acl.h" #include "kernel_operator.h" #define GM_ADDR uint8_t* // ========== Tiling 数据结构 ========== namespace <OpName>Op { struct <OpName>TilingData { int64_t totalLength; int64_t usedCoreNum; // ... 其他 Tiling 参数 }; } // ========== Host 部分:对外接口 ========== extern "C" aclError acltensor<OpName>(float* input, float* output, int64_t size, void* stream) { // 1. 参数检查 if (input == nullptr || output == nullptr || size <= 0) { return ACL_ERROR_INVALID_PARAM; } // 2. 计算 Tiling 数据(可用函数封装) <OpName>Op::<OpName>TilingData tilingData; tilingData.totalLength = size; tilingData.usedCoreNum = CalculateCoreNum(size); // 自定义函数 // ... 其他 Tiling 参数 // 3. 分配设备内存 uint8_t *inputDevice, *outputDevice, *tilingDevice; aclrtMalloc((void**)&inputDevice, size * sizeof(float), ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc((void**)&outputDevice, size * sizeof(float), ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc((void**)&tilingDevice, sizeof(tilingData), ACL_MEM_MALLOC_HUGE_FIRST); // 4. 拷贝数据到设备(先转换为 uint8_t*) uint8_t* inputHost = reinterpret_cast<uint8_t*>(input); uint8_t* outputHost = reinterpret_cast<uint8_t*>(output); aclrtMemcpy(inputDevice, size * sizeof(float), inputHost, size * sizeof(float), ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(tilingDevice, sizeof(tilingData), &tilingData, sizeof(tilingData), ACL_MEMCPY_HOST_TO_DEVICE); // 5. 调用核函数 <<<Block, workspace, stream>>> <op_name>_kernel_do(inputDevice, outputDevice, tilingDevice, nullptr, tilingData.usedCoreNum, stream); // 6. 同步并拷贝结果回主机 aclrtSynchronizeStream(stream); aclrtMemcpy(outputHost, size * sizeof(float), outputDevice, size * sizeof(float), ACL_MEMCPY_DEVICE_TO_HOST); // 7. 释放设备内存 aclrtFree(inputDevice); aclrtFree(outputDevice); aclrtFree(tilingDevice); return ACL_SUCCESS; } // ========== Kernel 部分:核函数实现 ========== using namespace AscendC; extern "C" __global__ __aicore__ void <op_name>(GM_ADDR input, GM_ADDR output, GM_ADDR tiling) { // Kernel 类型声明 KERNEL_TASK_TYPE_DEFAULT(KERNEL_TYPE_AIV_ONLY); // 初始化 TPipe pipe; // ... 初始化 LocalTensor、GlobalTensor、TQue 等 // 解析 Tiling 数据 auto tilingData = (<OpName>Op::<OpName>TilingData*)tiling; // 核心计算逻辑 for (int i = 0; i < tilingData->blockLoopCnt; ++i) { // 1. DataCopy: GM -> LocalTensor // 2. 计算 // 3. DataCopy: LocalTensor -> GM } } // 核函数封装 void <op_name>_kernel_do(GM_ADDR input, GM_ADDR output, GM_ADDR tiling, GM_ADDR workspace, uint32_t numBlocks, void *stream) { <op_name><<<numBlocks, workspace, stream>>>(input, output, tiling); }

Host 部分关键点

  1. 定义 TilingData 结构体(或 include 独立的_struct.h
  2. 计算 Tiling 参数
  3. 实现对外接口(如acltensorRfft1_dacltensorIfft1_d等)
  4. 使用<<<numBlocks, workspace, stream>>>调用核函数

Kernel 部分关键点

  1. 使用__global__ __aicore__标记核函数
  2. 实现 GM ↔ LocalTensor 的数据搬运
  3. 实现核心计算逻辑

2. Tiling 数据结构(可选)

文件<op_name>_struct.h

作用:定义 Host 传递给 Kernel 的 Tiling 参数

基本结构

#ifndef <OP_NAME>_STRUCT_H #define <OP_NAME>_STRUCT_H #include <cstdint> namespace <OpName>Op { struct <OpName>TilingData { int64_t totalLength; int64_t usedCoreNum; int64_t blockFormer; int64_t blockLoopCnt; int64_t blockTail; // ... 其他 Tiling 参数 }; } // namespace <OpName>Op #endif

说明

  • 这是一个简单的 C 结构体
  • 只包含基本数据类型(int64_t 等)
  • Host 计算参数,Kernel 读取参数
  • 也可以直接定义在.cpp文件中

3. 编译配置

文件CMakeLists.txt

register_operator( NAME <op_name> ARCH_DIR arch35 # 如果需要区分架构才加这个参数 )

4. 测试文件(强烈推荐)

参见 测试编写指南。

说明:虽然测试文件不是必需的,但强烈建议为每个算子编写单元测试,以确保算子实现的正确性。


开发流程

步骤 1:创建目录和文件

mkdir -p src/<op_name>/tests touch src/<op_name>/<op_name>.cpp touch src/<op_name>/CMakeLists.txt

(可选)独立的 struct 文件:

touch src/<op_name>/<op_name>_struct.h

(可选)测试文件:

touch src/<op_name>/tests/<op_name>_test.h touch src/<op_name>/tests/<op_name>_test.cpp

步骤 2:编写 Host + Kernel 实现

<op_name>.cpp中:

  1. 定义 TilingData 结构体(或 include 独立的_struct.h
  2. 实现对外接口(如acltensorRfft1_dacltensorIfft1_d等)
  3. 计算 Tiling 参数
  4. 实现核函数(使用__global__ __aicore__

步骤 3:配置编译

CMakeLists.txt中注册算子。

步骤 4:编写测试(推荐)

参考 测试编写指南。

步骤 5:编译验证

./build.sh --ops=<op_name> --run

关键概念

Host vs Kernel

层面运行位置职责
HostCPU对外接口、Tiling 计算、内存管理、启动 Kernel
KernelNPU AI Core实际计算逻辑

Tiling

目的:将大任务切分成适合 NPU 执行的小块

关键参数

  • usedCoreNum- 使用多少个 AI Core
  • blockFormer- 每次迭代处理多少数据
  • blockLoopCnt- 每个核迭代多少次

计算原则

  • 充分利用 AI Core 并行能力
  • 数据不超过 Unified Buffer 容量
  • 对齐到 32 字节边界

<<<>>> 核函数调用

<kernel_func><<<numBlocks, workspace, stream>>>(args...);

参数说明

  • numBlocks- 使用多少个 AI Core(Block)
  • workspace- 共享内存指针,通常设置为nullptr
  • stream- ACL 执行流

完整示例

参见src/rfft1_d/目录:

  • rfft1_d_host.cpp- Host 端实现(对外接口、Tiling 计算、内存管理)
  • rfft1_d_kernel.cpp- Kernel 端实现(核函数逻辑)
  • rfft1_d_struct.h- Tiling 数据结构
  • CMakeLists.txt- 编译配置

相关文档

  • 测试编写指南
  • build 参数说明

【免费下载链接】ops-fftops-fft 是 CANN (Compute Architecture for Neural Networks)算子库中提供 FFT 类计算的基础算子库,采用模块化设计,支持灵活的算子开发和管理。项目地址: https://gitcode.com/cann/ops-fft

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

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

PaperBanana:基于多智能体流程的AI科研绘图工具实战指南

1. 项目概述&#xff1a;用AI为科研论文自动绘制高质量图表 如果你和我一样&#xff0c;常年泡在实验室里写论文&#xff0c;那你一定对画图这件事又爱又恨。爱的是&#xff0c;一张清晰、美观的图表能让论文的“颜值”和说服力瞬间提升几个档次&#xff1b;恨的是&#xff0c…

作者头像 李华
网站建设 2026/5/10 6:01:35

Transformer架构核心原理与实战:从自注意力到多模态应用

1. 从零到一&#xff1a;理解Transformer架构的革命性地位如果你在2020年之前问我&#xff0c;自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;这两个领域最核心的模型架构是什么&#xff0c;我会毫不犹豫地告诉你&#xff1a;NLP看RNN/LSTM&a…

作者头像 李华
网站建设 2026/5/10 6:00:17

AI意识评估:从理论到工程实践的科学探索

1. 项目概述&#xff1a;当AI开始“思考”&#xff0c;我们如何评估&#xff1f;“AI意识评估”这个标题&#xff0c;听起来像科幻小说里的概念&#xff0c;但事实上&#xff0c;它正迅速从一个哲学思辨议题&#xff0c;演变为一个迫在眉睫的工程与伦理挑战。作为一名长期关注前…

作者头像 李华
网站建设 2026/5/10 5:55:31

基于向量数据库与语义检索的本地知识库构建实战指南

1. 项目概述&#xff1a;一个轻量级、可扩展的本地知识库构建工具 最近在折腾个人知识管理和团队文档协作时&#xff0c;我一直在寻找一个能兼顾轻量、灵活和强大检索能力的本地化工具。市面上的方案要么太重&#xff0c;部署复杂&#xff1b;要么太简单&#xff0c;功能单一。…

作者头像 李华
网站建设 2026/5/10 5:52:23

开源数据集成工具meridian-intelligence:架构解析与实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫mapleleaflatte03/meridian-intelligence。乍一看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你对数据集成、API聚合或者智能信息处理有点兴趣&#xff0c;那这个项目绝对值得你花时间研究…

作者头像 李华
网站建设 2026/5/10 5:50:07

DaVinci平台内存映射配置与优化实践

1. DaVinci系统内存映射基础概念在嵌入式系统开发中&#xff0c;内存映射配置是决定系统性能和稳定性的关键因素。TI DaVinci平台作为典型的异构多核处理器&#xff0c;其内存管理机制需要特别关注。这种架构通常包含ARM核和DSP核&#xff0c;两者通过共享内存进行通信&#xf…

作者头像 李华