visual-c++ - CUFFT - 填充/初始化问题

标签 visual-c++ cuda fft cufft

我正在查看 Nvidia SDK 的卷积 FFT 示例(对于大型内核),我知道傅立叶变换背后的理论及其 FFT 实现(至少是基础知识),但我无法弄清楚以下代码的作用:

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 的下一个幂,除非维度超过 1024,在这种情况下,它会四舍五入到 512 的下一个倍数。

在四舍五入 FFT 大小之后,您当然需要用零填充数据以使其成为 FFT 的正确大小。

请注意,我们通常需要为卷积进行四舍五入和填充的原因是因为每个 FFT 维度需要为 image_dimension + kernel_dimension - 1 ,这通常不是一个方便的数字,例如 2 的幂。

关于visual-c++ - CUFFT - 填充/初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5510935/

相关文章:

c# - 如何在 Windows 机器上制作虚拟扩展屏幕?

visual-studio-2010 - 警告MSB8012:确保$(OutDir),$(TargetName)和$(TargetExt)属性值与%(Link.OutputFile)中指定的值匹配

c# - 如何从音频文件中分离出声音?

matlab - 计算矩阵中每列或行的 fft

matlab - 如何在 MATLAB 中创建 FFT 图?

c++ - VS2010中的C99 : uint8_t* illegal use of type

c++ - 如何找到最大可能的子类(class)

cuda - 在 CUDA __device__ 函数的开始或结束处是否存在隐式屏障同步?

c++ - float1 与 CUDA 中的 float

opencv - 在 ubuntu 12.04 上安装 opencv4 tegra