首页 / 资讯中心 / 文章详情

FFTW 生成器仓库构建指南:理解自动代码生成架构与 git 源码的正确使用方式

FFTW 生成器仓库构建指南:理解自动代码生成架构与 git 源码的正确使用方式 ★ FEATURED ARTICLE
科学计算高性能计算【免费下载链接】fftw3DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING. (See below.)项目地址https://gitcode.com/gh_mirrors/ff/fftw3点击查看免费下载FFTW 是一个用 C 语言实现的一维与多维离散傅里叶变换DFT快速计算库支持复数、实数、对称与并行变换。与绝大多数开源项目不同FFTW 的 git 仓库只包含用于生成代码的生成器generator而不包含最终可编译的 C 源码因此直接执行configure; make或cmake必然失败。本文以仓库根目录的 README.md 与无扩展名 README 为骨架结合 bootstrap.sh、mkdist.sh、genfft 与 support/Makefile.codelets 等源码完整讲解 FFTW 的双轨发布架构、官方发布版与生成器仓库的区别、从 git 源码重建 codelet 的完整流程以及生成器的工作原理帮助读者判断自己应该走哪条构建路径。一、核心架构官方 tarball 与生成器仓库的双轨制FFTW 项目采用了一种在开源软件中极为罕见的发布策略同一份功能以两种形态存在。官方发布版release tarball包含全部已生成的 C 代码任何装有 C 编译器的系统都能直接编译不需要任何特殊工具或专业知识。这是绝大多数用户的正确选择。git 生成器仓库只包含生成器源码与构建脚本没有预生成的 codelet 代码必须由使用者自行运行代码生成过程。README.md 的第一行就给出醒目警告DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING.这份文件明确指出该仓库由 FFTW 作者维护是 FFTW 3.x 的 git 仓库但与大多数程序不同FFTW 的大部分 C 源码是自动生成的。此仓库包含生成器不包含生成的代码。README 补充说明FFTW 之所以能比大多数公开可用的 FFT 实现更快正是因为它采用了新颖的代码生成code generation与运行时自优化runtime self-optimization技术。也就是说FFTW 的性能优势与它无法直接编译的仓库其实是同一件事的两面为了在任意架构上榨取性能FFTW 用程序化的方式为各种变换尺寸生成高度特化的 C 代码codelet这些代码的数量与规模庞大不适合作为 git 仓库的常规内容维护于是发布时统一生成、打包进 tarball开发时则以生成器的形式保存在仓库中。二、为什么这个仓库无法直接configure; make或cmakeREADME.md 明确写道YOU WILL BE UNABLE TO COMPILE CODE FROM THIS REPOSITORYunless you have special tools and know what you are doing并特别强调不要指望简单地执行configure; make或cmake就能工作。从源码结构可以验证这一结论codelet 源文件在仓库中不存在。例如 dft/scalar/codelets/Makefile.am 中声明了一组 codelet 源文件n1_2.c、t1_2.c、q1_4.c等这些文件作为BUILT_SOURCES参与编译但它们的内容只能由生成器在构建期现场产生仓库里并不存放生成结果。生成器是 OCaml 程序需先编译生成器本身。genfft/Makefile.am 中列出的GENFFT_NATIVE如gen_notw.native、gen_twiddle.native、gen_r2cf.native、gen_hc2c.native等都要靠 OCaml 工具链构建普通用户的机器通常没有这一套环境。构建规则被MAINTAINER_MODE条件开关保护。support/Makefile.codelets 中所有 codelet 生成规则都包裹在if MAINTAINER_MODE内Makefile.am 中也只有开启MAINTAINER_MODE时才会把genfft编入构建GENFFT genfft。不开启该模式生成器既不编译codelet 也无从产生。因此对一个没有特殊工具的普通用户而言直接克隆本仓库并执行configure; make或cmake会在缺少 codelet 源文件、缺少 OCaml 生成器的情况下失败——这正是 README.md 反复警告的原因。三、大多数用户的正确路径从官方发布版安装如果你只是想在程序中调用 FFTW 计算傅里叶变换README 给出的建议非常简单忽略 git 仓库下载官方发布 tarball其中已包含全部生成代码不需要任何特殊工具任何有 C 编译器的系统都能编译然后按手册第 10 章 Installation and Customization 的说明操作。核心命令只有三步./configure make make install这即是 FFTW 官方发布版的标准安装流程。完整的手册位于 doc 目录texinfo 格式可生成 PDF、info 与 HTMLdoc/FAQ 目录下还有常见问题解答。需要快速了解 API 用法的读者可以直接阅读手册的 Tutorial 章节对应 doc/tutorial.texi其中给出fftw_plan_dft_1d、fftw_malloc、fftw_execute等基础调用示例。四、高级用户与维护者的路径从 git 仓库构建如果你确实需要自行生成 codelet例如定制变换尺寸、研究生成器原理、参与 FFTW 开发才应该使用本仓库。README 与 bootstrap.sh 给出了完整的构建流程。4.1 准备依赖工具从 git 仓库构建需要先安装以下程序README 明确列出ocaml与ocamlbuild编译生成器本体autoconf、automake、libtool生成 configure 与 makefileindent对生成的 C 代码做格式化此外还需要OCaml Num 库。README 特别提醒了一个历史坑Num 库曾是 OCaml 标准库的一部分但在 OCaml 4.06.02017-11-03中被无预警地移除。在 Fedora 30 上可以尝试安装ocaml-num-devel软件包补齐。这一依赖在 genfft/Makefile.am 中也能看到对应证据——OCaml 构建命令为$(OCAMLBUILD) -classic-display -pkgs num $(GENFFT_NATIVE)明确以num作为编译包。4.2 执行 bootstrap.sh一键启动生成流程依赖齐备后在仓库根目录执行sh bootstrap.sh makebootstrap.sh 的注释说明了它的定位This file is only for users that want to generate their own codelets仅适用于想要自行生成 codelet 的用户普通构建请直接走./configure make。脚本本身做了三件事touch ChangeLog——确保 ChangeLog 文件存在autoreconf --verbose --install --symlink --force——以 GNU Autotools 标准方式生成 configure 脚本并输出 PLEASE IGNORE WARNINGS AND ERRORS提示过程中会出现大量可忽略的警告以固定选项运行 configure./configure --disable-shared --enable-maintainer-mode --enable-threads $*其中--enable-maintainer-mode正是开启 codelet 生成能力的开关脚本注释它启用 genfft 的构建并在 genfft 变化时自动重建 codelet--disable-shared与--enable-threads则分别关闭共享库、开启线程支持$*允许透传其他自定义参数。4.3 重新运行 configure 的注意事项bootstrap.sh 会在内部直接运行一次 configure因此正常流程下无需手动配置。但如果你之后需要重新运行 configureREADME 明确要求必须补上--enable-maintainer-mode标志否则生成器不会被构建、codelet 不会自动再生./configure --enable-maintainer-mode [OTHER CONFIGURE FLAGS]4.4 mkdist.sh一键生成发布级 tarball如果你希望得到与官方发布包结构一致的产物可以使用 mkdist.sh。README 描述它为运行整个引导过程并生成与官方发布类似的 .tar.gz 文件的脚本。其内部流程从源码可读为校验当前 git HEAD 是否带有 taggit tag --contains HEAD未打 tag 则拒绝构建发布包——这是防止误发布未版本化代码的保护机制用git log生成 ChangeLog调用sh bootstrap.sh完成引导make maintainer-clean清理后以--enable-maintainer-mode --enable-single --enable-sse --enable-threads重新 configuremake -j 4并行构建最后make dist产出发布 tar.gz。五、生成器工作原理的源码级解读理解了构建流程后再深入看看生成器到底如何工作——这是本仓库区别于普通 FFT 项目的最核心技术点。5.1 genfft/用 OCaml 描述变换算法的代码生成器genfft 目录存放着 FFTW 的灵魂一套用OCaml 函数式语言编写的代码生成框架。其中既包含通用模块如expr.ml表达式表示、dag.ml有向无环图、schedule.ml指令调度、trig.ml三角函数化简、algsimp.ml代数化简等也包含面向不同变换类型的生成器前端gen_notw.ml生成非 twiddle DFT、gen_twiddle.ml生成带 twiddle 因子的 DFT、gen_r2cf.ml/gen_r2cb.ml生成实数到复数/复数到实数的变换、gen_hc2c.ml/gen_hc2hc.ml生成半复数变换、gen_r2r.ml生成实数到实数变换等。这套框架的工作方式是以数学描述DFT 求和公式为输入经过代数化简、调度与寄存器分配等优化阶段最终输出高度特化的 C 代码。换句话说FFTW 不是在运行时把通用算法翻译成机器码而是在构建期用 OCaml 把最优算法印刷成一个个专用 C 函数。5.2 codelet 的类型体系与生成规则Makefile.amdft/scalar/codelets 下用注释清晰解释了 codelet 的体系codelet 前缀含义依据该 Makefile.am 的注释n1_n固定大小的硬编码 FFT作为递归的基例如n1_2.c…n1_64.ct1_r实现 radix-r DIT 步的 twiddle FFTt2_r同 t1但三角函数表部分现场生成大尺寸下更快f1_r/f2_r实现 radix-r DIF 步的 twiddle FFT当前默认注释掉因为规划器几乎不用q1_rr 个 size-r 的 twiddle FFTDIF 步且输出转置用于原地转置场景这些 codelet 由 support/Makefile.codelets 中定义的 make 规则现场生成。以n1_%.c为例其规则为n1_%.c: $(CODELET_DEPS) $(GEN_NOTW) ($(PRELUDE_COMMANDS_DFT); $(TWOVERS) $(GEN_NOTW) $(FLAGS_N1) -n $* -name n1_$* -include dft/scalar/n.h) | $(ADD_DATE) | $(INDENT) $即先拼接版权头与代码模板support/codelet_prelude.dft再调用gen_notw.native传入尺寸-n、命名-name与头文件-include最后用indent格式化并写入目标 C 文件。每个生成器还支持-compact -variables 4 -pipeline-latency 4等优化参数FLAGS_COMMON影响生成代码的紧凑度与指令级流水线深度。同目录下的 dft/scalar含n.c、t.c、q.c等头文件与 rdft/scalar 则是这些 codelet 的 C 侧接口声明。5.3 SIMD codelet为每种指令集单独生成除了标量 codeletFFTW 还为不同 SIMD 指令集分别生成向量化版本。仓库中的 dft/simd 与 rdft/simd 目录按指令集分层组织sse2/、avx/、avx2/、avx-128-fma/、avx512/、neon/、altivec/、vsx/、sve128/…sve2048/、lsx/、lasx/、kcvi/等Makefile.am顶层则按HAVE_SSE2、HAVE_AVX等宏条件把对应 codelet 库链接进libfftw3。这些 SIMD 支持层的运行时检测与指令封装位于 simd-support例如 simd-support/x86-cpuid.h 负责在 x86 上通过 CPUID 探测指令集。理解了这一点就能明白为什么从 git 构建时必须先有完整的 OCaml 工具链——因为要先把这些面向全部指令集的生成器都编译出来。六、常用 configure 选项精度、SIMD 与并行无论走官方 tarball 路径还是 git 生成路径configure 的选项体系是共通的。依据 configure.ac当前仓库对应的 FFTW 版本为3.3.11FFTW_MAJOR_VERSION 3.3FFTW_MINOR_VERSION 11。常用选项包括精度--enable-single或同义词--enable-float编译单精度版本--enable-long-double编译 long-double 精度--enable-quad-precision在有支持时编译四倍精度。三者互斥configure.ac 中均有冲突检查。SIMD--enable-sse仅单精度可用、--enable-sse2如今双精度与单精度皆可用单精度下等价于--enable-sse、--enable-avx、--enable-avx2等。configure.ac 中注明历史上需要单精度配--enable-sse、双精度配--enable-sse2但自 2016 年起该行为已改变。并行--enable-threadspthread 多线程bootstrap.sh 与 mkdist.sh 均默认开启与--enable-openmp。其他--enable-debug额外运行时检查、--disable-alloca禁用 alloca规避 mingw64 上的问题、--disable-doc跳过手册构建、--enable-random-estimator伪随机估计器调试用。若使用 CMake 构建发布版源码可参考 CMakeLists.txt 中对应的ENABLE_FLOAT、ENABLE_LONG_DOUBLE、ENABLE_SSE2、ENABLE_AVX2、ENABLE_THREADS、ENABLE_OPENMP等选项。需要说明的是CMake 路径同样依赖仓库中已生成的 codelet 文件因此它适用于官方 tarball而非本生成器仓库。七、构建后的验证与基准测试FFTW 自带一套基准测试与正确性验证程序bench位于 tests。依据 tests/READMEbench -s problem/--speed测试指定问题的速度。问题语法为[i|o][r|c][f|b]size例如ib256表示 256 点的原地in-place向后复数变换32x64表示 32 行 × 64 列的二维向前复数变换。bench -y problem/--verify验证计算结果是否正确无输出即通过。bench -v2用fftw_print_plan输出规划出的执行计划。规划策略选项-oestimate/-opatient/-oexhaustive对应FFTW_ESTIMATE/FFTW_PATIENT/FFTW_EXHAUSTIVE默认FFTW_MEASUREREADME 建议基准测试时使用-opatient。-onthreadsN使用 N 个线程需以--enable-threads编译-owisdom从当前目录的wis.dat读写 wisdom 文件。此外 tests/check.pl 提供了自动化回归检查脚本。这些工具与 libbench2 库配合可以完整验证从生成器构建出的 FFTW 功能正确性与性能。八、总结如何选择正确的构建路径最后用一个判断标准帮助读者对号入座只想用 FFTW 计算傅里叶变换下载官方发布 tarball执行./configure make make install即可在任意带 C 编译器的系统上使用。不要克隆本 git 仓库这正是 README.md 的DO NOT CHECK OUT警告的本意。需要自定义 codelet、研究自动生成技术或参与 FFTW 开发才使用本仓库。按 README 与 bootstrap.sh 的流程先安装ocaml、ocamlbuild、autoconf、automake、indent、libtool与 OCamlnum库然后执行sh bootstrap.sh make需要重跑 configure 时务必带--enable-maintainer-mode要产出发布级 tarball 则执行sh mkdist.sh注意其要求 HEAD 已打 tag。理解生成器仓库 发布 tarball的双轨架构是安全、正确地使用 FFTW 源码的第一步。无论是把它当作普通库来链接还是深入其代码生成引擎本文梳理的构建路径与 genfft、support/Makefile.codelets、dft/scalar/codelets/Makefile.am 等关键文件都是你后续探索的可靠起点。赞分享科学计算高性能计算【免费下载链接】fftw3DO NOT CHECK OUT THESE FILES FROM GITHUB UNLESS YOU KNOW WHAT YOU ARE DOING. (See below.)项目地址https://gitcode.com/gh_mirrors/ff/fftw3点击查看免费下载相关推荐VueDraggableResizable前端交互设计的动态布局引擎VueDraggableResizable前端交互设计的动态布局引擎 在现代Web应用开发中用户对界面交互的期待已从静态展示转向动态操作。当开发者需要构建可后端Fiat-Crypto完整指南如何构建正确构造的密码学原语代码生成器 Fiat Crypto完整指南如何构建正确构造的密码学原语代码生成器 Fiat Crypto是一个革命性的开源项目专门用于 自动合成正确构造的密码学原Fiat-Crypto自动生成正确构造的加密原语代码的终极指南Fiat Crypto自动生成正确构造的加密原语代码的终极指南 在当今数字安全至关重要的时代 Fiat Crypto项目 正革命性地改变着加密原语代码的开发上一篇3步打造个人品牌hve作者信息高级配置指南下一篇db_tutorial开发指南如何实现数据库的命令扩展机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站