2016-01-22 408 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); 

最後,我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

實值信號的DFT呈現厄米特對稱性(見real-input DFT on wikipedia)。因此,可以僅從第一個輸出值(即其他輸出是冗餘的)中構建完整的輸出值D。

相應地,對於許多實值輸入的FFT實現,cuFFT不會返回頻譜的冗餘上部分(如cuFFT library user's guide的2.4節所示)。在你使用16點FFT的情況下,你可以得到非冗餘輸出16/2 + 1 = 9。那麼每個FFT的9個值將在最終的dst緩衝區中連續打包(因此,每9個複數將開始一個新的FFT結果)。

+0

只是更精確,它是floor(N/2)+1複數值。所以15,你會得到8個複合體。 – widgg

相關問題