FlagFFT 用户指南#
使用 C API#
FlagFFT 在 include/flagfft.h 中提供与 cuFFT 兼容的 C API。
创建计划#
flagfftPlan1d(plan, nx, type, batch)
flagfftPlan2d(plan, nx, ny, type)
flagfftPlan3d(plan, nx, ny, nz, type) // NOT_SUPPORTED
flagfftPlanMany(plan, rank, n, inembed, istride, idist,
onembed, ostride, odist, type, batch)
执行变换#
// 复数到复数(单精度和双精度)
flagfftExecC2C(plan, idata, odata, direction)
flagfftExecZ2Z(plan, idata, odata, direction)
// 实数到复数(正向)
flagfftExecR2C(plan, idata, odata)
flagfftExecD2Z(plan, idata, odata)
// 复数到实数(逆向)
flagfftExecC2R(plan, idata, odata)
flagfftExecZ2D(plan, idata, odata)
管理计划#
flagfftSetStream(plan, stream) // 附加 CUDA 流
flagfftDestroy(plan) // 释放计划资源
flagfftGetPlanDescription(plan) // 人类可读的计划摘要
数据类型#
FlagFFT 类型 |
C 类型 |
描述 |
|---|---|---|
|
|
单精度复数 |
|
|
双精度复数 |
|
|
单精度实数 |
|
|
双精度实数 |
变换类型#
类型常量 |
变换 |
|---|---|
|
复数 → 复数 |
|
双精度复数 → 双精度复数 |
|
实数 → 复数 |
|
双精度实数 → 双精度复数 |
|
复数 → 实数 |
|
双精度复数 → 双精度实数 |
支持的功能#
功能 |
状态 |
|---|---|
一维任意长度 C2C、Z2Z |
Cooley-Tukey + Bluestein/Rader |
一维任意长度 R2C、D2Z(正向) |
已支持 |
一维任意长度 C2R、Z2D(逆向) |
已支持 |
一维往返(R2C→C2R、D2Z→Z2D) |
已支持 |
二维连续行优先 C2C、Z2Z |
RTRT 分解 |
二维连续行优先 R2C、D2Z、C2R、Z2D |
已支持 |
批量变换 |
已支持 |
原地和异地 |
已支持 |
CUDA 流附加 |
已支持 |
计划中 / 尚未支持#
功能 |
状态 |
|---|---|
三维变换( |
返回 |
二维更多执行算法 |
目前仅支持 RTRT |
使用原生 CLI#
flagfft-cli 是一个原生基准测试和验证工具。使用 -DFLAGFFT_BUILD_CLI=ON 构建。
基准测试 FFT 性能#
flagfft-cli bench [OPTIONS]
选项 |
默认值 |
描述 |
|---|---|---|
|
|
变换秩: |
|
|
变换类型: |
|
必填 |
变换尺寸,逗号分隔: |
|
|
批量大小 |
|
|
|
|
|
|
|
|
预热迭代次数 |
|
|
测量迭代次数 |
|
— |
以 JSON 格式输出结果 |
|
— |
打印执行计划分解路径(与 |
示例:
# 基准测试一维 C2C FFT,尺寸 4096,批量 256
flagfft-cli bench --api c2c --shape 4096 --batch 256
# 基准测试二维 Z2Z FFT
flagfft-cli bench --rank 2 --api z2z --shape 256x256
# 比较多种尺寸,JSON 输出
flagfft-cli bench --api r2c --shape 1024,2048,4096,8192 --json
# 打印内核执行计划
flagfft-cli bench --api c2c --shape 997 --print-path --json
自动调优(计划中)#
flagfft-cli tune [OPTIONS]
目前为占位符;退出并返回 FLAGFFT_NOT_SUPPORTED。
退出码#
码 |
含义 |
|---|---|
|
通过 |
|
失败 / 参数无效 |
|
运行时错误 |
|
跳过 / 不支持 |
运行测试#
FlagFFT 有三层测试:统一的 Python 测试运行器、C++ 单元测试(Google Test)和 Python 代码生成测试(pytest)。
使用统一测试运行器#
tools/run_tests.py 是运行完整测试套件的主要入口。它协调精度测试(C++ ctest 二进制文件,比较 FlagFFT 输出与 cuFFT)和性能基准测试(flagfft-cli bench)。
用法#
python tools/run_tests.py [OPTIONS]
标志 |
默认值 |
描述 |
|---|---|---|
|
— |
要测试的算子 ID,逗号分隔 |
|
— |
每行一个算子 ID 的文件路径 |
|
— |
按字典序跳过此值之前的算子 |
|
|
要包含的阶段,逗号分隔( |
|
|
测试组合: |
|
|
GPU ID,逗号分隔,或 |
|
|
摘要和每个算子结果文件的目录 |
|
|
CMake 构建目录路径 |
|
— |
仅运行精度测试 |
|
— |
仅运行性能(基准测试)测试 |
|
|
每个测试的子进程超时秒数 |
|
|
基准测试预热迭代次数 |
|
|
基准测试测量迭代次数 |
|
— |
将每个测试的 stdout/stderr 保存到日志文件 |
|
|
颜色模式: |
|
— |
详细输出 |
组合预设#
预设 |
描述 |
|---|---|
|
快速冒烟测试 —— Cooley-Tukey 尺寸,批量 1,缩放 1.0 |
|
快速冒烟测试 —— Bluestein/Rader 尺寸,批量 1,缩放 1.0 |
|
完整一维 —— 所有 CT 尺寸 × 所有批量 × 所有缩放 |
|
快速二维 —— 选定的二维尺寸,批量 {1,4},缩放 1.0 |
|
完整二维 —— 选定的二维尺寸 × 所有批量 × 所有缩放 |
示例#
# 快速冒烟测试(默认)
python tools/run_tests.py
# GPU 0 上的完整测试套件
python tools/run_tests.py --combination full --gpus 0
# 跨 4 个 GPU 的完整套件
python tools/run_tests.py --combination full --gpus 0,1,2,3
# 仅精度测试,特定算子
python tools/run_tests.py --combination full --ops c2c_1d,r2c_1d --accuracy-only
# 仅性能基准测试
python tools/run_tests.py --combination full --performance-only
输出#
控制台:实时进度,每个 GPU 状态
results/summary.json—— 顶层摘要,包含timestamp、env、config、result和summary部分results/{op_id}/accuracy_result.json—— 每个算子的精度详情results/{op_id}/performance_result.json—— 每个算子的基准测试详情
如果所有精度测试通过,退出码为 0,任何失败则为 1。
运行 C++ 测试#
使用 -DFLAGFFT_BUILD_TESTS=ON 构建。每个测试二进制文件使用范数相对误差指标(rel_l2、rel_linf)比较 FlagFFT 输出与 cuFFT。
测试结构#
测试模式 |
覆盖范围 |
|---|---|
|
计划生命周期、错误码、不支持的 API 合约 |
|
二维 C2C/Z2Z 正确性 |
|
C2C 正向/逆向,Cooley-Tukey/Bluestein,单/多批量 |
|
双精度复数 |
|
Float 实数 → 复数 |
|
Double 实数 → 复数 |
|
复数 → float 实数 |
|
双精度复数 → 双精度实数 |
|
实数往返验证 |
|
双精度实数往返 |
后缀说明:s = 单批量,b = 多批量;ct = Cooley-Tukey,bs = Bluestein/Rader。
运行单个测试#
# 运行特定测试
./build/ctest/test_exec_c2c_fwd_ct_s
# 使用自定义参数
./build/ctest/test_exec_c2c_fwd_ct_s --nx 4096 --batch 64 --direction forward
# 运行所有 ctest 测试
cd build && ctest --output-on-failure
每个测试二进制文件接受:--nx、--batch、--direction、--scale、--json-file。
运行 Python 测试#
针对 flagfft_codegen Python 包的测试。需要安装该包(pip install .)。
# 运行所有 Python 测试
pytest tests/python/ -v
# 仅运行标记为 codegen 的测试
pytest tests/python/ -v -m codegen
测试涵盖 codelet 结构、内核源码生成、JIT CSV 解析以及 Bluestein/reshape/R2C 元数据。需要 Triton/TLE 的测试在依赖不可用时自动跳过。
配置测试#
测试参数空间在 conf/ 中定义:
conf/operators.yaml—— 14 个算子定义(一维/二维 × C2C/Z2Z/R2C/D2Z/C2R/Z2D,加上往返)conf/test_matrix.yaml—— 参数空间:11 个平滑尺寸(CT)、4 个质数/复合尺寸(Bluestein)、3 个批量大小、3 个缩放因子、6 个组合规则