CUDA FFT не возвращает ожидаемые значения
В настоящее время я отлаживаю свой код, где я использую подпрограммы CUDA FFT.
У меня есть что-то вроде этого (см. Комментарии для моих мыслей о том, что я делаю):
#include <cufft.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include <cuComplex.h>
void foo(double* real, double* imag, size_t size)
{
cufftHandle plan;
cufftDoubleComplex* inputData;
cufftDoubleReal* outputReal;
//Allocation of arrays:
size_t allocSizeInput = sizeof(cufftDoubleComplex) * size;
size_t allocSizeOutput = sizeof(cufftDoubleReal) * (size - 1) * 2;
cudaMalloc((void**)&outputReal, allocSizeOutput);
cudaMalloc((void**)&inputData, allocSizeInput);
//Now I put the data in the arrays real and imag into input data by
//interleaving it
cudaMemcpy2D(static_cast<void*>(inputData),
2 * sizeof (double),
static_cast<const void*>(real),
sizeof(double),
sizeof(double),
size,
cudaMemcpyHostToDevice);
cudaMemcpy2D(static_cast<void*>(inputData) + sizeof(double),
2 * sizeof (double),
static_cast<const void*>(imag),
sizeof(double),
sizeof(double),
size,
cudaMemcpyHostToDevice);
//I checked inputData at this point and it does indeed look like i expect it to.
//Now I create the plan
cufftPlan1d(&plan, size, CUFFT_Z2D, 1);
//Now I execute the plan
cufftExecZ2D(plan, inputData, outputReal);
//Now I wait for device sync
cudaDeviceSynchronize();
//Now I fetch up the data from device
double* outDbl = new double[(size-1)*2]
cudaMemcpy(static_cast<void*>(outDbl),
static_cast<void*>(outputReal),
allocSizeOutput,
cudaMemcpyDeviceToHost);
//Here I am doing other fancy stuff which is not important
}
Итак, проблема, с которой я столкнулся сейчас, заключается в том, что результаты в outDbl не соответствуют ожидаемым. Например, если я приведу следующие значения в эту функцию:
действительный = [0 -5,567702511594111 -5,595068807897317 -5,595068807897317 -5,567702511594111]
imag = [0 9.678604224870535 2.280007038673738 -2.280007038673738 -9.678604224870535]
Я ожидаю получить:
результат = [-4,46511 -3,09563 -0,29805 2,51837 5,34042]
Но я получаю что-то совершенно другое.
Что я делаю не так? Я неправильно понял функцию FFT? Разве это не в основном обратное БПФ от сложного к реальному? Есть ли проблема в моих процедурах копирования данных?
Я должен признать, что я немного потерян на этом.
1 ответ
Да жаль. Я нашел ответ на stackru после того, как задал вопрос.
Смотрите здесь
По сути: cuda fft не нормализуется, поэтому я должен разделить полученные значения на количество элементов, чтобы получить нормализованные значения.