gpt4 book ai didi

cuda - CUFFT:如何计算倾斜指针的 fft?

转载 作者:行者123 更新时间:2023-12-05 00:35:24 25 4
gpt4 key购买 nike

我正在尝试使用 CUFFT 计算图像的 fft。似乎 CUFFT 只提供 fft 的普通设备指针分配给 cudaMalloc

我的输入图像是使用 cudaMallocPitch 分配的,但是没有用于处理图像指针间距的选项。

目前,我必须删除行的对齐方式,然后执行 fft,并将结果复制回倾斜指针。我目前的代码如下:

void fft_device(float* src, cufftComplex* dst, int width, int height, int srcPitch, int dstPitch)
{
//src and dst are device pointers allocated with cudaMallocPitch

//Convert them to plain pointers. No padding of rows.
float *plainSrc;
cufftComplex *plainDst;

cudaMalloc<float>(&plainSrc,width * height * sizeof(float));
cudaMalloc<cufftComplex>(&plainDst,width * height * sizeof(cufftComplex));

cudaMemcpy2D(plainSrc,width * sizeof(float),src,srcPitch,width * sizeof(float),height,cudaMemcpyDeviceToDevice);

cufftHandle handle;
cufftPlan2d(&handle,width,height,CUFFT_R2C);

cufftSetCompatibilityMode(handle,CUFFT_COMPATIBILITY_NATIVE);

cufftExecR2C(handle,plainSrc,plainDst);

cufftDestroy(handle);

cudaMemcpy2D(dst,dstPitch,plainDst,width * sizeof(cufftComplex),width * sizeof(cufftComplex),height,cudaMemcpyDeviceToDevice);

cudaFree(plainSrc);
cudaFree(plainDst);
}

它给出了正确的结果,但我不想在函数内部进行 2 次额外的内存分配和复制。我想做这样的事情:

void fft_device(float* src, cufftComplex* dst, int width, int height, int srcPitch, int dstPitch)
{
//src and dst are device pointers allocated with cudaMallocPitch
//Don't know how to handle pitch here???
cufftHandle handle;
cufftPlan2d(&handle,width,height,CUFFT_R2C);

cufftSetCompatibilityMode(handle,CUFFT_COMPATIBILITY_NATIVE);

cufftExecR2C(handle,src,dst);

cufftDestroy(handle);
}

问题:

如何使用CUFFT直接计算pitched pointer的fft?

最佳答案

我认为您可能对 cufftPlanMany 感兴趣,它可以让您使用音调进行 1D、2D 和 3D ffts。这里的关键是 inembed 和 onembed 参数。

您可以查看 CUDA_CUFFT_Users_Guide.pdf(第 23-24 页)以获取更多信息。但对于您的示例,您将执行如下操作。

void fft_device(float* src, cufftComplex* dst,
int width, int height,
int srcPitch, int dstPitch)
{
cufftHandle handle;
int rank = 2; // 2D fft
int n[] = {width, height}; // Size of the Fourier transform
int istride = 1, ostride = 1; // Stride lengths
int idist = 1, odist = 1; // Distance between batches
int inembed[] = {srcPitch, height}; // Input size with pitch
int onembed[] = {dstPitch, height}; // Output size with pitch
int batch = 1;
cufftPlanMany(&handle, rank, n,
inembed, istride, idist,
onembed, ostride, odist, CUFFT_R2C, batch);

cufftSetCompatibilityMode(handle,CUFFT_COMPATIBILITY_NATIVE);
cufftExecR2C(handle,src,dst);
cufftDestroy(handle);
}

附言为了这里的示例,我没有添加返回支票。始终检查代码中的返回值。

关于cuda - CUFFT:如何计算倾斜指针的 fft?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14026900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com