5.4 CUFFT

CUFFT реализация библиотеки быстрого преобразования Фурье (БПФ) FFT (Fast Fourier Transform) для CUDA. БПФ — это алгоритм эффективного вычисления дискретных преобразований Фурье для комплексных или вещественных наборов данных. Является одним из наиболее важных и широко используемых численных алгоритмов, с приложениями, которые включают в себя вычислительную физику и общую обработку сигналов. Библиотека CUFFT предоставляет простой интерфейс для параллельных вычислений FFT на GPU, что позволяет пользователям использовать оперировать числами с плавающей точкой, и использовать параллелизм GPU без необходимости разработки собственной реализации БПФ ориентированной на GPU.

FFT библиотеки обычно различаются поддерживаемы форматами преобразования и типами данных. Например, некоторые библиотеки реализовывают только Radix-2 FFT, ограничивая размер преобразования второй степенью, в то время как другие реализации поддерживают преобразования произвольных размеров. Библиотека CUFFT поддерживает следующие функции:

1.
1D, 2D и 3D преобразования сложных и вещественных данных;
2.
пакетное выполнение нескольких преобразований любой размерности параллельно;
3.
2D и 3D преобразования в диапазоне [2,16384] в любой размерности;
4.
1D преобразования до 8 миллионов элементов;
5.
преобразования для действительных и комплексных данных;
6.
двойная точность преобразования для совместимых устройств (GT200 и более поздних версий);
7.
поддержка потокового исполнения, позволяющая одновременные вычисления вместе с изменением данных.

Сначала происходит построение "плана который оптимизирует время вычислений для данной задачи. Затем построенный план передается в качестве параметра функциям, которые непосредственно отвечают за вычисление БПФ. Пример одномерного преобразования комплексного набора данных в комплексный:

#define NX 256 
#define BATCH 10 
 
CUFFTHandle plan; 
CUFFTComplex *data; 
cudaMalloc((void**)&data, sizeof(CUFFTComplex)*NX*BATCH); 
 
// создать оценочный “план” для БПФ 
CUFFTPlan1d(&plan, NX, CUFFT_C2C, BATCH); 
 
// использовать CUFFT “план” для преобразования сигнала. 
CUFFTExecC2C(plan, data, data, CUFFT_FORWARD); 
 
// использовать CUFFT “план” для обратного преобразования сигнала. 
CUFFTExecC2C(plan, data, data, CUFFT_INVERSE); 
 
// удалить CUFFT “план”. 
CUFFTDestroy(plan); 
cudaFree(data);