Cuda 在袖口中使用FFTW兼容模式

Cuda 在袖口中使用FFTW兼容模式,cuda,fftw,cufft,Cuda,Fftw,Cufft,我有一个完整的项目创建使用FFTW。我想过渡到使用袖口。我知道cuFFT有一个“兼容模式”。但这到底是如何工作的呢?说: 应用程序使用FFTW3接口工作后,用户可以 想要修改他们的代码,以便在GPU之间移动数据,并使用 FFTW转换指南中记录的例程,以获得最佳 表演 这是否意味着我实际上需要更改我的单个函数调用?例如,打电话 cufftPlan1d()而不是fftw\u plan\u dft\u 1d() 我是否也必须更改数据类型 fftw_complex *inputData;

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

应用程序使用FFTW3接口工作后,用户可以 想要修改他们的代码,以便在GPU之间移动数据,并使用 FFTW转换指南中记录的例程,以获得最佳 表演

这是否意味着我实际上需要更改我的单个函数调用?例如,打电话
cufftPlan1d()
而不是
fftw\u plan\u dft\u 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?

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

您可能想要的是。我建议您阅读本文档,因为它可能接近您的想法。这将允许您在FFTW应用程序中使用cuFFT,且更改量最小。如文件所示,只需两个步骤:

  • 建议您将include文件
    fftw3.h
    替换为
    cufftw.h
  • 不要与双精度/单精度库(如fftw3/fftw3f库)链接,而是与CUFFT和CUFFTW库链接
对于您摘录的文档项,如果您只是使用cuFFTW兼容性接口,则不需要执行该步骤(显式移动数据)。但是,您可能无法通过这种方式实现最高性能。如果您想获得最大的性能,您可能需要以本机方式使用cuFFT,例如,这样您就可以显式地管理数据移动。这是否重要取决于应用程序的具体结构(例如,您正在进行多少FFT,以及是否有任何数据在多个FFT之间共享)。如果您打算以本机方式使用cuFFT,则以下注释适用:

是的,您需要更改单个函数调用。它们必须与API、相关头文件和库中的函数名对齐。
fftw\u
函数名不在袖口库中

您可以检查您的数据类型,应该发现对于基本数据类型,如
float
double
、complex等,它们应该在cuFFT和FFTW之间具有布局兼容性。就我个人而言,我建议将您的数据类型更改为cuFFT数据类型,但此时不应存在功能或性能差异

尽管您没有提到,但是cuFFT还将要求您在CPU/主机和GPU之间移动数据,这一概念与FFTW无关


关于
CufftSectCompatibilityMode
,其目的和讨论相当清楚。它与总体数据布局有关,特别是FFTW的数据填充。

您可能想要的是。我建议您阅读本文档,因为它可能接近您的想法。这将允许您在FFTW应用程序中使用cuFFT,且更改量最小。如文件所示,只需两个步骤:

  • 建议您将include文件
    fftw3.h
    替换为
    cufftw.h
  • 不要与双精度/单精度库(如fftw3/fftw3f库)链接,而是与CUFFT和CUFFTW库链接
对于您摘录的文档项,如果您只是使用cuFFTW兼容性接口,则不需要执行该步骤(显式移动数据)。但是,您可能无法通过这种方式实现最高性能。如果您想获得最大的性能,您可能需要以本机方式使用cuFFT,例如,这样您就可以显式地管理数据移动。这是否重要取决于应用程序的具体结构(例如,您正在进行多少FFT,以及是否有任何数据在多个FFT之间共享)。如果您打算以本机方式使用cuFFT,则以下注释适用:

是的,您需要更改单个函数调用。它们必须与API、相关头文件和库中的函数名对齐。
fftw\u
函数名不在袖口库中

您可以检查您的数据类型,应该发现对于基本数据类型,如
float
double
、complex等,它们应该在cuFFT和FFTW之间具有布局兼容性。就我个人而言,我建议将您的数据类型更改为cuFFT数据类型,但此时不应存在功能或性能差异

尽管您没有提到,但是cuFFT还将要求您在CPU/主机和GPU之间移动数据,这一概念与FFTW无关


关于
CufftSectCompatibilityMode
,其目的和讨论相当清楚。它与总体数据布局有关,特别是FFTW的数据填充。

因此
CufftSectCompatibilityMode()
仅在我使用本机cuFFT时才相关?该方法的第一个参数是cuFFT句柄,如果使用FFTW,我可能没有该句柄。有可能将两者“混合”吗?例如,对除“execute”之外的所有内容使用接口,然后对“execute”使用本机cuff?另外,如果我只使用接口,是否有方法获取函数返回值(即CUFFT_SUCCESS)?是的,如果严格使用cuFFTW接口,
CufftCompatibilityMode()
是不相关的。是的,可以混合使用这两种API。除了“execute”之外,您不能将FFTW接口用于所有操作,因为除非您实际使用FFTW接口执行,否则它不会影响数据复制过程。CUFT“execute”假定数据已经被复制。我不知道如何严格使用cuFFTW接口获取函数返回值。但是,对于支持的fftw函数,还应支持任何类型的状态参数