2016-01-22 5 views
1

Я экспериментирую с партией с cuFFT. Но я не думаю, что получаю правильный результат.cuFFT R2C размер выходного пакета не соответствует размеру ввода

int NX = 16; // size of the array 
int BATCH = 16; // # of batch 

Я выделение двух массивов на GPU:

float *src; 
cufftComplex *dst; 
cudaMalloc((void**)&src, sizeof(float)*NX*BATCH); 
cudaMalloc((void**)&dst, sizeof(cufftComplex)*NX*BATCH); 

Я инициализирует массив источника с простым ядром, как это:

__global__ void initFloatArray(float *data, const int size) { 
    const int i = (blockIdx.x * blockDim.x) + threadIdx.x; 
    if (i < size) { 
    data[i] = i % NX; 
    } 
} 

так в основном, каждый из массива имеет значения от 0 до 15. И я получаю это 16 раз.

Я создаю мой план, как это:

cufftPlanMany(&plan, 1, &NX, nullptr, 1, NX, nullptr, 1, NX, CUFFT_R2C, BATCH); 

, а затем я свой план выполнения:

cufftExecR2C(plan, src, dst); 

Наконец, я передаю содержание целевой_адреса обратно к хозяину. Но когда я распечатать значения, я получаю это:

BATCH 0: 
    <120, 0>.length = 120 
    <-8, 40.2187>.length = 41.0066 
    <-8, 19.3137>.length = 20.905 
    <-8, 11.9728>.length = 14.3996 
    <-8, 8>.length = 11.3137 
    <-8, 5.34543>.length = 9.62152 
    <-8, 3.31371>.length = 8.65914 
    <-8, 1.5913>.length = 8.15673 
    <-8, 0>.length = 8 
    <120, 0>.length = 120 
    <-8, 40.2187>.length = 41.0066 
    <-8, 19.3137>.length = 20.905 
    <-8, 11.9728>.length = 14.3996 
    <-8, 8>.length = 11.3137 
    <-8, 5.34543>.length = 9.62152 
    <-8, 3.31371>.length = 8.65914 
BATCH 1: 
    <-8, 1.5913>.length = 8.15673 
    <-8, 0>.length = 8 
    <120, 0>.length = 120 
    <-8, 40.2187>.length = 41.0066 
    <-8, 19.3137>.length = 20.905 
    <-8, 11.9728>.length = 14.3996 
    ... 

Я ожидал повторяющийся выхода, но это повторять каждые 9 числа, а не каждые 16, как это должно быть.

Я что-то не так? Или есть что-то, что я не понимаю.

ответ

1

ДПФ реального знака проявляют эрмитовую симметрию (см. real-input DFT on wikipedia). В результате, полные комплексные выходные значения N-точечного DFT могут быть построены только из первых выходных значений N/2+1 (т. Е. Другие выходы являются избыточными).

Соответственно, как и в случае многих реализаций FFT для вещественных входов, cuFFT не возвращает избыточную верхнюю часть спектра (как указано в разделе 2.4 из cuFFT library user's guide). В вашем случае с 16-точечным FFT вы получите 16/2 + 1 = 9 не-избыточные выходы. Затем эти 9 значений на БПФ упаковываются обратно в ваш окончательный буфер dst (таким образом, новый результат FFT запускается каждые 9 комплексных чисел).

+0

, если быть точнее, это пол (N/2) +1 комплексные значения. Итак, за 15 вы получаете 8 комплексов. – widgg