|
| 1 | +# FlagFFT 概览 |
| 2 | + |
| 3 | +FlagFFT 是一个实验性的 C++ FFT 库,提供与 cuFFT 风格兼容的 API 以及基于 Triton/TLE 生成的 CUDA 内核。公开的运行时接口为 C 语言;Python 仅用于 Triton/TLE JIT 源码生成(内部代码生成)。 |
| 4 | + |
| 5 | +FlagFFT 是 [FlagOS](https://flagos.io/) 生态系统的组成部分,为科学计算、信号处理和机器学习工作负载提供高性能 FFT 计算。 |
| 6 | + |
| 7 | +## 特性 |
| 8 | + |
| 9 | +- **cuFFT 风格 API** —— 为从 cuFFT 迁移的开发者提供熟悉的计划创建和执行接口。 |
| 10 | +- **JIT 内核编译** —— 内核在计划创建时通过 Triton/TLE 生成,消除执行时的 Python 编译延迟。 |
| 11 | +- **任意长度的一维和二维变换** —— 通过融合四步路径支持任意复合长度,包括超大尺寸(如 n = 2^23),无需回退到 Bluestein。二维 FFT 支持全部六种变换类型。 |
| 12 | +- **多种变换类型** —— C2C、Z2Z(复数),R2C、D2Z、C2R、Z2D(实数到复数及其逆变换)。 |
| 13 | +- **计划描述** —— `flagfftGetPlanDescription` 返回计划节点树、内核名称和编译详情的详细信息,用于性能调试。 |
| 14 | +- **原生 CLI** —— `flagfft-cli` 提供基准测试测量和计划检查功能,无需 Python 开销。 |
| 15 | + |
| 16 | +## 架构 |
| 17 | + |
| 18 | +### C++ 运行时 |
| 19 | + |
| 20 | +| 模块 | 描述 | |
| 21 | +|---|---| |
| 22 | +| `include/flagfft.h` | cuFFT 风格的不透明句柄 API,后端中立的 `flagfftStream_t` | |
| 23 | +| `src/exec/` | `flagfftHandle` 生命周期、计划创建、流状态、计划缓存、原始指针执行调度 | |
| 24 | +| `src/plan/` | 将 `FFTRequest` 映射为 `PlanNode` 树 —— 节点、因子分解、成本、自动候选、调优候选 | |
| 25 | +| `src/codegen/` | 在计划创建期间调用 Python Triton/TLE 源码生成,通过 libtriton_jit 编译 | |
| 26 | +| `python/flagfft_codegen/` | 可通过 pip 安装的源码生成器和绑定的 codelet | |
| 27 | +| `src/adaptor/` | 设备分配、流/事件操作、目标标识、能力查询(CUDA Driver 后端) | |
| 28 | +| `src/utils/` | 共享的请求/键工具、JSON/SQLite 调优支持 | |
| 29 | + |
| 30 | +### 原始执行节点 |
| 31 | + |
| 32 | +- `CompiledRawLeafNode` —— 使用计划拥有的旋转因子和 DFT 表分配启动连续叶子内核。 |
| 33 | +- `CompiledRawFourStepFusedNode` —— 带有行和列叶子子节点的四步路径,拥有旋转因子和中间缓冲区。 |
| 34 | +- `CompiledRawBluesteinNode` —— 通过 JIT 准备、逐点、最终化和卷积 FFT 子内核处理质数和复杂复合长度。 |
| 35 | +- `CompiledRaw2DNode` —— 连续复数二维计划,采用 RTRT 路径(行 FFT → 分块转置 → 行 FFT → 分块转置回)。 |
| 36 | + |
| 37 | +### CLI 工具 |
| 38 | + |
| 39 | +`src/cli_tools/common/` 拥有 `CaseSpec`、确定性缓冲区生成、FlagFFT/cuFFT 调度和比较。cuFFT 仅在 CLI 中用作 CUDA 验证/性能基准。 |
| 40 | + |
| 41 | +- `bench` —— 在预热和计时前将 FlagFFT 和 cuFFT 参考计划绑定到一个适配器流。 |
| 42 | +- `tune` —— 占位符;退出并返回 `FLAGFFT_NOT_SUPPORTED`。 |
| 43 | + |
| 44 | +### 构建选项 |
| 45 | + |
| 46 | +| 选项 | 默认值 | 描述 | |
| 47 | +|---|---|---| |
| 48 | +| `FLAGFFT_BUILD_CLI` | `OFF` | 构建 `flagfft-cli` 及其 cuFFT 依赖 | |
| 49 | +| `FLAGFFT_BUILD_TESTS` | `OFF` | 构建 `ctest/` 下的 Google Test 目标 | |
| 50 | +| `BACKEND` | `CUDA` | GPU 后端选择器(目前仅支持 `CUDA`) | |
| 51 | + |
| 52 | +### Python 边界 |
| 53 | + |
| 54 | +原生运行时调用 `python -m flagfft_codegen.jit_source`;所选的 Python 环境必须提供兼容的 Triton/TLE 依赖。生成的 JIT 源码/元数据存放在可执行文件旁边的 `.flagfft` 中。 |
| 55 | + |
| 56 | +### 测试 |
| 57 | + |
| 58 | +- `ctest/` —— 所有算子的 Google Test 精度测试。 |
| 59 | +- `tools/run_tests.py` —— 统一测试运行器,协调多 GPU 的精度和性能测试。 |
| 60 | +- `tests/python/` —— 代码生成测试。 |
| 61 | + |
| 62 | +## 工作流程 |
| 63 | + |
| 64 | +1. 使用 `flagfftPlan1d`(或 `flagfftPlanMany` 用于批量变换)创建 FFT 计划。 |
| 65 | +2. 可选地使用 `flagfftSetStream` 附加 CUDA 流。 |
| 66 | +3. 使用 `flagfftExec*` 函数执行变换。 |
| 67 | +4. 使用 `flagfftDestroy` 销毁计划。 |
0 commit comments