精度和性能注意事项#
NVPL FFT 采用 Cooley-Tukey 算法 来优化特定变换大小的性能。
Cooley-Tukey 算法将 DFT 矩阵表示为稀疏构建块矩阵的乘积,其中 NVPL FFT 实现了 radix-2
、radix-3
、radix-5
和 radix-7
构建块。因此,当变换大小可以写成 \(2^a \times 3^b \times 5^c \times 7^d\) 的形式时,NVPL FFT 效率更高,其中 a、b、c 和 d 为一些非负整数。
对于不能写成这种形式的大小,则使用 Bluestein 算法。由于 Bluestein 算法的实现比 Cooley-Tukey 算法的实现每个输出点需要更多的计算,因此 Cooley-Tukey 算法具有更好的精度。
有关如何获得更好的 NVPL FFT 性能的通用技巧,请参阅表:NVPL FFT 性能技巧。
适用 |
建议 |
注释 |
---|---|---|
全部 |
使用单精度变换。 |
单精度变换比双精度变换每次计算所需的带宽更少。 |
全部 |
限制每个维度的大小以使用更少的不同质因数。 |
尺寸为 \(2^n\) 或 \(3^m\) 的变换通常比尺寸为 \(2^i\times 3^j\) 的变换更快,即使后者略小,这归因于专用路径的组成。 |
全部 |
当执行单个变换时,限制数据在内存中是连续的。当执行多个变换时,使各个数据集是连续的。 |
该库针对此数据布局进行了优化。 |
全部 |
执行多个,即批量变换。 |
该库在批量模式下执行了额外的优化。 |
Grace 和 AWS Graviton 3 CPU |
使用等于 CPU 核心数的线程数 |
该库在此配置下实现最佳性能。 |
警告
如发行说明中所述,某些受支持的 FFT 大小,包括复合大小和大于 50K 元素的大小,尚未完全优化。
结果可再现性#
NVPL FFT 产生的结果是确定性的,即可按位重现的,只要 (1) 计划输入参数,(2) 多线程设置,(3) NVPL FFT 版本和 (4) CPU 型号在运行之间保持不变。
注意
不同数量的线程可能会导致性能优化的不同代码路径。因此,以不同线程数运行的结果可能彼此不同。
注意
如 cuFFT 一样,当在批量模式下计算 DFT 时,来自不同批次的信号可以组合在一起进行处理以进行性能优化。因此,来自批量模式和非批量执行的结果可能会表现出差异。