3

在我的应用程序中,我需要转换图像的每一行,应用过滤器并将其转换回来。

我希望能够使用 GPU 同时进行多个 FFT。更准确地说,我使用的是 NVIDIA 的 CUDA。现在,一些考虑:

  1. CUDA的FFT库,CUFFT只能从主机调用(https://devtalk.nvidia.com/default/topic/523177/cufft-device-callable-library/)。
  2. 关于这个主题(在 GPU 上运行 FFTW 与使用 CUFFT),Robert Corvella 说

    “可以由多个主机线程调用 cufft 例程”。

我相信并行执行所有这些 FFT 会提高性能,但 Robert 评论说

“FFT 操作的规模相当大,那么只需按照指示调用 cufft 库例程即可为您提供良好的加速并大致充分利用机器”

那么,是这样吗?一次执行多个 FFT 是否没有任何好处?

是否有任何库支持来自设备的调用?

如果我只使用 cufftPlanMany() 代替(如挂起的“is-there-a-method-of-fft-that-will-run-inside-cuda-kernel”中所指或罗伯特在前一个主题中所指的那样) ?

或者最好的选择是调用多个主机线程?

(这 2 个链接的限制正在杀死我......)

我的目标是讨论什么是这个问题的最佳解决方案,因为许多人都面临过类似的情况。一旦 NVIDIA 在 CUFFT 上实现设备调用,这可能会过时。(他们说他们正在努力,但没有预期的发布日期 - 在 NVIDIA 论坛(第一个链接)的讨论中说的话)

4

1 回答 1

2

那么,是这样吗?一次执行多个 FFT 是否没有任何好处?

如果单个 FFT 足够大以充分利用设备,则一次执行多个 FFT 没有任何好处。您仍然可以使用复制和计算重叠等标准方法来充分利用机器的性能。

如果 FFT 很小,那么批处理计划是获得最佳性能的好方法。如果你走这条路,我推荐使用 CUDA 5.5,因为有一些 API 改进。

是否有任何库支持来自设备的调用?

不能通过从设备代码进行调用来使用 cuFFT 库。

当然还有其他的 CUDA 库,比如 ArrayFire,它可能有我不熟悉的选项。

如果我只使用 cufftPlanMany() 代替(如挂起的“is-there-a-method-of-fft-that-will-run-inside-cuda-kernel”中所指或罗伯特在前一个主题中所指的那样) ? 或者最好的选择是调用多个主机线程?

批处理计划优于多个主机线程 - API 可以通过这种方式更好地进行资源管理,并且您将有更多 API 级别的可见性(例如通过 CUDA 5.5 中的资源估计功能)来了解可能的情况。

于 2013-08-09T11:16:42.330 回答