使用CUDA并行化FFT

3

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

我想能够使用GPU同时进行多个FFT。 更确切地说,我正在使用NVIDIA的CUDA。 现在,有些考虑:

  1. CUDA的FFT库CUFFT只能从主机进行调用(https://devtalk.nvidia.com/default/topic/523177/cufft-device-callable-library/)。
  2. 在此主题(running FFTW on GPU vs using CUFFT)上,Robert Corvella表示
  3. “cufft例程可以被多个主机线程调用”。

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

“如果FFT操作具有相当大的大小,则仅按照指示调用cufft库例程应该为您提供良好的加速,并且近似充分利用机器”

那么,这就是它了吗?一次执行多个FFT没有任何收益吗?

有支持从设备调用的库吗?

我应该只使用cufftPlanMany()吗(如hang在“is-there-a-method-of-fft-that-will-run-inside-cuda-kernel”中提到的或如Robert在之前的话题中提到的)?

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

(这两个链接的限制让我很纠结...)

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


你可以编写自己的FFT内核... - Christopher Stevenson
1个回答

2
“那么,就是这样吗?一次执行多个FFT没有任何收益?” 如果单个FFT足够大以充分利用设备,则一次执行多个FFT没有任何收益。您仍然可以使用标准方法(如重叠复制和计算)来获得机器的最佳性能。如果FFT很小,则{{link1:batched plan}}是获得最佳性能的好方法。如果选择这种方法,建议使用CUDA 5.5,因为有一些API改进。
“是否有支持从设备调用的库?” cuFFT库不能通过从设备代码进行调用来使用。当然,还有其他CUDA库,例如ArrayFire,可能有我不熟悉的选项。
“我应该只是使用cufftPlanMany()(如hang在“是否有一种可以在CUDA内核中运行的FFT方法”中提到的,或者如Robert在先前的话题中提到的)?还是最好调用多个主机线程?” 批处理计划优于多个主机线程-这样API可以更好地管理资源,并且您将具有更多的API级别可见性(例如通过CUDA 5.5中的资源估算函数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接