我正在研究卷積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);
}
也不是爲什麼複雜的飛機是這樣初始化的。
您能否提供給我解釋鏈接或答案?
對於所有的FFT實現來說,2的冪不是必須的,看起來CUFFT可以處理更大的FFT大小的2的非冪次,反之它使用512的倍數。對於卷積,通常不能使FFT大小爲2的冪,因爲尺寸需要是image_dimension + kernel_dimension - 1,因此需要舍入和填充。 – 2011-04-01 08:59:59
我的意思是兩個倍數。更正了謝謝。 – fabrizioM 2011-04-01 09:05:47
@farbrizioM:2的倍數和2的倍數都不是必需的。 FFT可以用於任何可以分解成小素數的大小,例如, FFTW的工作因子爲2,3,5,7。 – 2011-04-01 09:51:26