Question

I have a full project created using FFTW. I want to transition to using cuFFT. I understand that cuFFT has a "compatibility mode". But how exactly does this work? The cuFFT manual says:

After an application is working using the FFTW3 interface, users may want to modify their code to move data to and from the GPU and use the routines documented in the FFTW Conversion Guide for the best performance.

Does this mean I actually need to change my individual function calls? For example, call cufftPlan1d() instead of fftw_plan_dft_1d().

Do I also have to change my data types?

    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?

If I'm going to have to rewrite all of my code, what is the point of cufftSetCompatabilityMode(.)?

Was it helpful?

Solution

Probably what you want is the cuFFTW interface to cuFFT. I suggest you read this documentation as it probably is close to what you have in mind. This will allow you to use cuFFT in a FFTW application with a minimum amount of changes. As indicated in the documentation, there should only be two steps requred:

  • It is recommended that you replace the include file fftw3.h with cufftw.h
  • Instead of linking with the double/single precision libraries such as fftw3/fftw3f libraries, link with both the CUFFT and CUFFTW libraries

Regarding the doc item you excerpted, that step (moving the data explicitly) is not required if you're just using the cuFFTW compatibility interface. However, you may not achieve maximum performance this way. If you want to achieve maximum performance, you may need to use cuFFT natively, for example so that you can explicitly manage data movement. Whether or not this is important will depend on the specific structure of your application (how many FFT's you are doing, and whether any data is shared amongst multiple FFTs, for example.) If you intend to use cuFFT natively, then the following comments apply:

Yes, you need to change your individual function calls. They must line up with function names in the API, associated header files, and library. The fftw_ function names are not in the cuFFT library.

You can inspect your data types and should discover that for the basic data types like float, double, complex, etc. they should be layout-compatible between cuFFT and FFTW. Personally I would recommend changing your data types to cuFFT data types, but there should be no functional or performance difference at this time.

Although you don't mention it, cuFFT will also require you to move the data between CPU/Host and GPU, a concept that is not relevant for FFTW.

Regarding cufftSetCompatibilityMode, the function documentation and discussion of FFTW compatibility mode is pretty clear on it's purpose. It has to do with overall data layout, especially padding of data for FFTW.

OTHER TIPS

Check this link out : Here, it says that all we need to do is change the linking.

https://developer.nvidia.com/blog/cudacasts-episode-8-accelerate-fftw-apps-cufft-55/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top