实现高性能#
在高性能计算中,编写自定义代码的能力使用户能够实现更好的性能。对于 cuFFTDx 而言,现有 FFT 应用程序的性能改进潜力很高,但这在很大程度上取决于库的使用方式。以常规 cuFFT 库为基准,性能可能会好或差一个数量级。因此,将现有资源移植到 cuFFTDx 应该始终与性能分析并行进行。下面我们列出一些可能在此过程中有所帮助的通用建议。
通用建议#
尝试使用库提供的默认设置以获得最佳计算性能。
计算密集型和内存密集型内核的最佳参数可能并不相同。
确保 FFT 内核运行足够的块以填充 GPU,从而达到峰值性能。
将相邻的内存密集型内核(预处理和后处理)与 FFT 内核合并,以节省全局内存访问。
内存管理#
避免从全局内存读取/写入数据。
确保全局内存读取/写入是合并的(如果需要,增加 每个块的 FFT 算子 的值)。
使用
shared
共享内存或额外的寄存器来存储临时数据。
内核融合#
对于复杂的内核,请考虑调整 FFT 操作以匹配用户内核。(例如,调整 每个线程的元素算子 将会改变所需的 CUDA 块大小)。即将推出的 cuFFTDx 版本将提供更多自定义选项。
对于简单的操作,请考虑将操作合并到针对 FFT 性能优化的 FFT 内核中。
高级#
对于未完全填充 GPU 的 FFT 负载,请考虑在单独的流中运行并行内核。
Nsight Compute 占用率计算器 [6] 和/或 cudaOccupancyMaxActiveBlocksPerMultiprocessor [8] 函数来确定最佳启动参数。
使用 Nsight Compute [7] 来确定在不损失占用率的情况下还有哪些额外的可用资源。