要求和功能#
要求#
cuFFTDx 库是一个仅包含 CUDA C++ 头的库。因此,使用该库所需的软件列表相对较小。用户需要
CUDA 工具包 11.0 或更高版本
受支持的 CUDA 编译器
受支持的主机编译器(需要 C++17)
(可选)CMake(版本 3.18 或更高版本)
受支持的编译器#
CUDA 编译器
NVCC 11.0.194+(CUDA 工具包 11.0 或更高版本)
(实验性支持)NVRTC 11.0.194+(CUDA 工具包 11.0 或更高版本)
主机 / C++ 编译器
GCC 7+
Clang 9+(仅在 Linux/WSL2 上)
(初步支持)MSVC 1920+(Windows/Visual Studio 2019 16.0 或更高版本)
警告
使用 MSVC 作为 CUDA 主机编译器进行编译需要启用 __cplusplus
(/Zc:__cplusplus)。为了做到这一点,请将 -Xcompiler "/Zc:__cplusplus"
作为选项传递给 NVCC。否则可能会导致错误,报告类 dim3
的变量不能声明为 constexpr
。
注意
cuFFTDx 会为不受支持的编译器版本发出错误,可以通过在编译期间定义 CUFFTDX_IGNORE_DEPRECATED_COMPILER
来静默这些错误。cuFFTDx 不保证能与 cuFFTDx 中不支持的编译器版本一起使用。
注意
cuFFTDx 会为不受支持的 C++ 标准版本发出错误,可以通过在编译期间定义 CUFFTDX_IGNORE_DEPRECATED_DIALECT
来静默这些错误。cuFFTDx 不保证能与 cuFFTDx 中不支持的 C++ 标准版本一起使用。
支持的功能#
- 支持的功能包括
cuFFTDx 支持 [0; max_size]
范围内的选定 FFT 大小,其中 max_size
取决于精度和 CUDA 架构,如下表所示,以及 [0; max_size_fp64/2]
范围内的所有 FFT 大小,其中 max_size_fp64
是给定 CUDA 架构的双精度最大 FFT 大小。但是,并非大小、精度、每个线程的元素数和每个块的 FFT 数的每种组合都是正确且可用的。下表总结了可用的配置
注意
实数到复数和复数到实数的块 FFT 在每种精度中都有额外的可用大小(在表中用加号添加),但这仅在使用 real_mode::folded
值作为 RealFFTOptions
运算符时才可访问。类似地,线程执行可以为所有偶数大小采用 real_mode::folded
,范围是常规范围的两倍,如下表所示。有关更多详细信息,请参阅 RealFFTOptions 运算符。
精度 |
线程 FFT |
块 FFT |
|||
---|---|---|---|---|---|
C2C 和 R2C/C2R 常规 |
R2C/C2R 折叠 |
架构 |
C2C 和 R2C/C2R 常规 |
R2C/C2R 折叠 |
|
半精度 |
[2; 64] |
范围内的偶数:[4; 128] |
75 |
[2; 16384] |
范围内的 2 的幂:[4; 8192] |
70;72;86;89 |
[2; 24389] |
范围内的 2 的幂:[4; 32768] |
|||
80;87;90 |
[2; 32768] |
范围内的 2 的幂:[2; 65536] |
|||
单精度 |
[2; 64] |
范围内的偶数:[4; 128] |
75 |
[2; 16384] |
范围内的 2 的幂:[2; 8192] |
70;72;86;89 |
[2; 24389] |
范围内的 2 的幂:[2; 32768] |
|||
80;87;90 |
[2; 32768] |
范围内的 2 的幂:[2; 65536] |
|||
双精度 |
[2; 32] |
范围内的偶数:[4; 64] |
75 |
[2; 8192] |
范围内的 2 的幂:[2; 4096] |
70;72;86;89 |
[2; 12167] |
范围内的 2 的幂:[2; 16384] |
|||
80;87;90 |
[2; 16384] |
范围内的 2 的幂:[2; 32768] |
注意
cuFFTDx 0.3.0 添加了对 [0; max_size_fp64/2]
范围内所有大小的初步支持。大多数大小将需要您使用全局内存分配创建额外的工作区。有关工作区的更多详细信息,请参阅 创建工作区函数。您可以使用 FFT::requires_workspace 特性检查给定的 FFT 是否需要工作区。
提示
自 cuFFTDx 1.1.0 起,可以使用 cufftdx::is_supported 检查给定的 CUDA 架构是否支持 FFT 描述。
以下大小的 FFT 不需要工作区
2 的幂,最大到 32768。
3 的幂,最大到 19683。
5 的幂,最大到 15625。
6 的幂,最大到 7776。
7 的幂,最大到 16807。
10 的幂,最大到 10000。
11 的幂,最大到 1331。
12 的幂,最大到 1728。
13 的幂,最大到 2187。
14 的幂,最大到 2744。
15 的幂,最大到 3375。
17 的幂,最大到 4913。
18 的幂,最大到 5832。
19 的幂,最大到 6859。
20 的幂,最大到 8000。
21 的幂,最大到 9261。
22 的幂,最大到 10649。
23 的幂,最大到 12167。
24 的幂,最大到 13824。
26 的幂,最大到 17576。
29 的幂,最大到 21952。
30 的幂,最大到 27000。
32 的幂,最大到 29781。
小于 512 的 4 的因子。
- 在 cuFFTDx 的未来版本中
对于其他配置,工作区要求可能会被移除。
不需要工作区的 FFT 配置将继续如此。
对于上面列出的部分大小,在没有工作区要求的情况下可以获得性能加速,这可以在 图 1 和 图 2 中看到。它显示了 cuFFTDx 1.3.0 中相同 FFT 大小获得的加速,与 cuFFTDx 1.2.1(有工作区要求)中的先前实现相比。
图 1 单精度复数到复数正向 FFT 在 H100 80GB HBM3 上使用 cuFFTDx 1.3.0 和建议参数的最大时钟频率时的加速。图表显示了与 cuFFTDx 1.2.1 相比的加速。#
图 2 双精度复数到复数正向 FFT 在 H100 80GB HBM3 上使用 cuFFTDx 1.3.0 和建议参数的最大时钟频率时的加速。图表显示了与 cuFFTDx 1.2.1 相比的加速。#
- 尚未支持的功能包括
存储在全局内存中的输入/输出。输入数据必须在寄存器或共享内存中。
BlockDim 运算符,它支持 CUDA 块维度的细粒度自定义。