2011-04-01 50 views
2

我正在研究卷積FFT示例的Nvidia SDK(對於大內核),我知道傅里葉變換及其FFT實現背後的理論(至少是基礎知識),但我不能弄清楚下面的代碼做什麼:CUFFT - 填充/初始化問題

const int fftH = snapTransformSize(dataH + kernelH - 1); 
const int fftW = snapTransformSize(dataW + kernelW - 1); 

....//gpu initialization code 

printf("...creating R2C & C2R FFT plans for %i x %i\n", fftH, fftW); 
     cuf ftSafeCall(cufftPlan2d(&fftPlanFwd, fftH, fftW, CUFFT_R2C)); 
     cufftSafeCall(cufftPlan2d(&fftPlanInv, fftH, fftW, CUFFT_C2R)); 

    printf("...uploading to GPU and padding convolution kernel and input data\n"); 
     cutilSafeCall(cudaMemcpy(d_Kernel, h_Kernel, kernelH * kernelW * sizeof(float), cudaMemcpyHostToDevice)); 
     cutilSafeCall(cudaMemcpy(d_Data, h_Data, dataH * dataW * sizeof(float), cudaMemcpyHostToDevice)); 
     cutilSafeCall(cudaMemset(d_PaddedKernel, 0, fftH * fftW * sizeof(float))); 
     cutilSafeCall(cudaMemset(d_PaddedData, 0, fftH * fftW * sizeof(float))); 

     padKernel(
      d_PaddedKernel, 
      d_Kernel, 
      fftH, 
      fftW, 
      kernelH, 
      kernelW, 
      kernelY, 
      kernelX 
     ); 

     padDataClampToBorder(
      d_PaddedData, 
      d_Data, 
      fftH, 
      fftW, 
      dataH, 
      dataW, 
      kernelH, 
      kernelW, 
      kernelY, 
      kernelX 
     ); 

我從來沒有使用CUFFT庫之前,所以我不知道是什麼snapTransformSize確實

(這裏的代碼)

int snapTransformSize(int dataSize){ 
    int hiBit; 
    unsigned int lowPOT, hiPOT; 

    dataSize = iAlignUp(dataSize, 16); 

    for(hiBit = 31; hiBit >= 0; hiBit--) 
     if(dataSize & (1U << hiBit)) break; 

    lowPOT = 1U << hiBit; 
    if(lowPOT == dataSize) 
     return dataSize; 

    hiPOT = 1U << (hiBit + 1); 
    if(hiPOT <= 1024) 
     return hiPOT; 
    else 
     return iAlignUp(dataSize, 512); 
} 

也不是爲什麼複雜的飛機是這樣初始化的。

您能否提供給我解釋鏈接或答案?

回答

2

這似乎是四捨五入的FFT尺寸爲2的下一個動力,除非尺寸將超過1024個,在這種情況下,它調高至512

下一個倍數已經圍捕FFT的大小那麼你當然需要用零填充你的數據,使它成爲FFT的正確大小。

需要注意的是,我們通常需要圍捕和墊卷積是因爲每個FFT尺寸必須image_dimension + kernel_dimension - 1,這通常不是一個方便的數,如2

1

什麼動力@原因保羅R說是正確的。爲什麼這樣做是因爲快速傅里葉變換操作 需要以最快的速度執行兩個倍數。請參閱Cooley-Tukey algorithm

只要確保您聲明的矩陣是2的冪,並且您不應該需要該通用安全實現。

+0

對於所有的FFT實現來說,2的冪不是必須的,看起來CUFFT可以處理更大的FFT大小的2的非冪次,反之它使用512的倍數。對於卷積,通常不能使FFT大小爲2的冪,因爲尺寸需要是image_dimension + kernel_dimension - 1,因此需要舍入和填充。 – 2011-04-01 08:59:59

+0

我的意思是兩個倍數。更正了謝謝。 – fabrizioM 2011-04-01 09:05:47

+1

@farbrizioM:2的倍數和2的倍數都不是必需的。 FFT可以用於任何可以分解成小素數的大小,例如, FFTW的工作因子爲2,3,5,7。 – 2011-04-01 09:51:26