FlagFFT 概览#
FlagFFT 是一个实验性的 C++ FFT 库,提供与 cuFFT 风格兼容的 API 以及基于 Triton/TLE 生成的 CUDA 内核。公开的运行时接口为 C 语言;Python 仅用于 Triton/TLE JIT 源码生成(内部代码生成)。
FlagFFT 是 FlagOS 生态系统的组成部分,为科学计算、信号处理和机器学习工作负载提供高性能 FFT 计算。
特性#
cuFFT 风格 API —— 为从 cuFFT 迁移的开发者提供熟悉的计划创建和执行接口。
JIT 内核编译 —— 内核在计划创建时通过 Triton/TLE 生成,消除执行时的 Python 编译延迟。
任意长度的一维和二维变换 —— 通过融合四步路径支持任意复合长度,包括超大尺寸(如 n = 2^23),无需回退到 Bluestein。二维 FFT 支持全部六种变换类型。
多种变换类型 —— C2C、Z2Z(复数),R2C、D2Z、C2R、Z2D(实数到复数及其逆变换)。
计划描述 ——
flagfftGetPlanDescription返回计划节点树、内核名称和编译详情的详细信息,用于性能调试。原生 CLI ——
flagfft-cli提供基准测试测量和计划检查功能,无需 Python 开销。
架构#
C++ 运行时#
模块 |
描述 |
|---|---|
|
cuFFT 风格的不透明句柄 API,后端中立的 |
|
|
|
将 |
|
在计划创建期间调用 Python Triton/TLE 源码生成,通过 libtriton_jit 编译 |
|
可通过 pip 安装的源码生成器和绑定的 codelet |
|
设备分配、流/事件操作、目标标识、能力查询(CUDA Driver 后端) |
|
共享的请求/键工具、JSON/SQLite 调优支持 |
原始执行节点#
CompiledRawLeafNode—— 使用计划拥有的旋转因子和 DFT 表分配启动连续叶子内核。CompiledRawFourStepFusedNode—— 带有行和列叶子子节点的四步路径,拥有旋转因子和中间缓冲区。CompiledRawBluesteinNode—— 通过 JIT 准备、逐点、最终化和卷积 FFT 子内核处理质数和复杂复合长度。CompiledRaw2DNode—— 连续复数二维计划,采用 RTRT 路径(行 FFT → 分块转置 → 行 FFT → 分块转置回)。
CLI 工具#
src/cli_tools/common/ 拥有 CaseSpec、确定性缓冲区生成、FlagFFT/cuFFT 调度和比较。cuFFT 仅在 CLI 中用作 CUDA 验证/性能基准。
bench—— 在预热和计时前将 FlagFFT 和 cuFFT 参考计划绑定到一个适配器流。tune—— 占位符;退出并返回FLAGFFT_NOT_SUPPORTED。
构建选项#
选项 |
默认值 |
描述 |
|---|---|---|
|
|
构建 |
|
|
构建 |
|
|
GPU 后端选择器(目前仅支持 |
Python 边界#
原生运行时调用 python -m flagfft_codegen.jit_source;所选的 Python 环境必须提供兼容的 Triton/TLE 依赖。生成的 JIT 源码/元数据存放在可执行文件旁边的 .flagfft 中。
测试#
ctest/—— 所有算子的 Google Test 精度测试。tools/run_tests.py—— 统一测试运行器,协调多 GPU 的精度和性能测试。tests/python/—— 代码生成测试。
工作流程#
使用
flagfftPlan1d(或flagfftPlanMany用于批量变换)创建 FFT 计划。可选地使用
flagfftSetStream附加 CUDA 流。使用
flagfftExec*函数执行变换。使用
flagfftDestroy销毁计划。