我有一个使用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(.)
有什么意义?
答案 0 :(得分:3)
你想要的是cuFFTW interface to cuFFT。我建议您阅读本文档,因为它可能与您的想法非常接近。这将允许您在FFTW应用程序中使用cuFFT并进行最少量的更改。如文档中所示,只需要执行两个步骤:
fftw3.h
cufftw.h
关于您摘录的doc项,如果您只是使用cuFFTW兼容性界面,则不需要该步骤(显式移动数据)。但是,您可能无法以这种方式获得最佳性能。如果要实现最高性能,可能需要本机使用cuFFT,例如,以便您可以显式管理数据移动。这是否重要将取决于您的应用程序的具体结构(例如,您正在做多少FFT,以及是否在多个FFT之间共享任何数据。)如果您打算本机使用cuFFT,则以下注释适用:
是的,您需要更改单个函数调用。它们必须与API,关联的头文件和库中的函数名称对齐。 fftw_
函数名称不在cuFFT库中。
您可以检查数据类型,并且应该发现对于float
,double
,复杂等基本数据类型,它们应该在cuFFT和FFTW之间布局兼容。我个人建议将数据类型更改为cuFFT数据类型,但此时应该没有功能或性能差异。
虽然你没有提到它,但cuFFT还要求你在CPU /主机和GPU之间移动数据,这个概念与FFTW无关。
关于cufftSetCompatibilityMode
,function documentation和FFTW compatibility mode的讨论非常清楚其目的。它与整体数据布局有关,尤其是FFTW的数据填充。