要求和功能#


要求#

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++ 标准版本一起使用。

支持的功能#

支持的功能包括
  • 创建块描述符,以在单个 CUDA 块中运行集体 FFT 操作(一个或多个线程协作计算一个或多个 FFT)。请参阅 块运算符

  • 创建线程描述符,以每个线程运行单个 FFT 操作。为了获得正确的结果和更高的性能,此功能可能需要更多 cuFFTDx 专业知识。请参阅 线程运算符

  • 双向信息流,从用户到描述符通过 运算符,以及从描述符到用户通过 特性

  • 使用 SM 运算符 定位特定的 GPU 架构。这使户能够使用建议的参数配置描述符以定位性能。

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(有工作区要求)中的先前实现相比。

FFT convolution performance speedup for some of the new sizes introduced in cuFFTDx 1.3.0 vs cuFFTDx 1.2.1.

图 1 单精度复数到复数正向 FFT 在 H100 80GB HBM3 上使用 cuFFTDx 1.3.0 和建议参数的最大时钟频率时的加速。图表显示了与 cuFFTDx 1.2.1 相比的加速。#

FFT convolution performance speedup for some of the new sizes introduced in cuFFTDx 1.3.0 vs cuFFTDx 1.2.1.

图 2 双精度复数到复数正向 FFT 在 H100 80GB HBM3 上使用 cuFFTDx 1.3.0 和建议参数的最大时钟频率时的加速。图表显示了与 cuFFTDx 1.2.1 相比的加速。#

尚未支持的功能包括
  • 存储在全局内存中的输入/输出。输入数据必须在寄存器或共享内存中。

  • BlockDim 运算符,它支持 CUDA 块维度的细粒度自定义。