在cuFFT中使用FFTW兼容模式

时间:2013-08-19 19:06:31

标签: cuda fftw cufft

我有一个使用FFTW创建的完整项目。我想过渡到使用cuFFT。我知道cuFFT有一个“兼容模式”。但这究竟是如何工作的呢? The cuFFT manual说:

  

应用程序使用FFTW3界面后,用户可以   想要修改他们的代码来将数据移入和移出GPU并使用   最好的FFTW转换指南中记录的例程   性能

这是否意味着我实际上需要更改我的个别函数调用?例如,打电话 cufftPlan1d()代替fftw_plan_dft_1d()

我是否还必须更改数据类型?

    fftw_complex *inputData;    // fftw data storage gets replaced..
    cufft_complex *inputData;   // ... by cufft data storage?

    fftw_plan forwardFFT;       // fftw plan gets replaced...
    cufftHandle forwardFFT;     // ... by cufft plan?

如果我要重写所有代码,那么cufftSetCompatabilityMode(.)有什么意义?

1 个答案:

答案 0 :(得分:3)

你想要的是cuFFTW interface to cuFFT。我建议您阅读本文档,因为它可能与您的想法非常接近。这将允许您在FFTW应用程序中使用cuFFT并进行最少量的更改。如文档中所示,只需要执行两个步骤:

  • 建议您使用fftw3.h
  • 替换包含文件cufftw.h
  • 不是与双/单精度库(如fftw3 / fftw3f库)链接,而是与CUFFT和CUFFTW库链接

关于您摘录的doc项,如果您只是使用cuFFTW兼容性界面,则不需要该步骤(显式移动数据)。但是,您可能无法以这种方式获得最佳性能。如果要实现最高性能,可能需要本机使用cuFFT,例如,以便您可以显式管理数据移动。这是否重要将取决于您的应用程序的具体结构(例如,您正在做多少FFT,以及是否在多个FFT之间共享任何数据。)如果您打算本机使用cuFFT,则以下注释适用:

是的,您需要更改单个函数调用。它们必须与API,关联的头文件和库中的函数名称对齐。 fftw_函数名称不在cuFFT库中。

您可以检查数据类型,并且应该发现对于floatdouble,复杂等基本数据类型,它们应该在cuFFT和FFTW之间布局兼容。我个人建议将数据类型更改为cuFFT数据类型,但此时应该没有功能或性能差异。

虽然你没有提到它,但cuFFT还要求你在CPU /主机和GPU之间移动数据,这个概念与FFTW无关。

关于cufftSetCompatibilityModefunction documentationFFTW compatibility mode的讨论非常清楚其目的。它与整体数据布局有关,尤其是FFTW的数据填充。