CUFFT库实践(1)

adagio_chen 2014-06-30 09:17:22
加精
好吧,最近经常要使用快速傅立叶变换来解决一些问题。下面就给出一个1维FFT的例子。特别需要注意的是,一组信号做一次FFT再做一次逆FFT,并不等于原信号,而需要做一次归一化(代码中的Scale函数)。



// 实数与复数之间的互相转换。楼猪死脑子,只用C2C......
__global__
void RToC(int size, float* input, float2* output)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < size)
{
output[i].x = input[i];
output[i].y = 0;
}
}

__global__
void CToR(int size, float2* input, float* output)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < size)
{
output[i] = input[i].x;
}
}

template <class T>
__global__
void Scale(int size, T* input, float scale)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < size)
{
input[i] *= scale;
}
}

// 正向 FFT
void FFT1D(int nx, float* input, float2* output)
{
float* input_d;
checkCudaErrors( cudaMalloc((void**)&input_d, nx * sizeof(float)) );
checkCudaErrors( cudaMemcpy(input_d, input, nx * sizeof(float), cudaMemcpyHostToDevice) );

float2* input_c;
checkCudaErrors( cudaMalloc((void**)&input_c, nx * sizeof(float2)) );

int thread = 128;
int block = nx / 128 + 1;
RToC<<<block, thread>>>(nx, input_d, input_c);

cufftHandle plan;
cufftPlan1d(&plan, nx, CUFFT_C2C, 1);
cufftExecC2C(plan, input_c, input_c, CUFFT_FORWARD);

checkCudaErrors( cudaMemcpy(output, input_c, nx * sizeof(float2), cudaMemcpyDeviceToHost) );

cudaFree(input_c);
cudaFree(input_d);
}

// 逆向 FFT
void IFFT1D(int nx, float2* input, float* output)
{
float2* input_d;
checkCudaErrors( cudaMalloc((void**)&input_d, nx * sizeof(float2)) );
checkCudaErrors( cudaMemcpy(input_d, input, nx * sizeof(float2), cudaMemcpyHostToDevice) );

cufftHandle plan;
cufftPlan1d(&plan, nx, CUFFT_C2C, 1);
cufftExecC2C(plan, input_d, input_d, CUFFT_INVERSE);

float* output_d;
checkCudaErrors( cudaMalloc((void**)&output_d, nx * sizeof(float)) );

int thread = 128;
int block = nx / thread + 1;
CToR<<<block, thread>>>(nx, input_d, output_d);

Scale<<<block, thread>>>(nx, output_d, 1.0f / nx);

checkCudaErrors( cudaMemcpy(output, output_d, nx * sizeof(float), cudaMemcpyDeviceToHost) );

cudaFree(input_d);
cudaFree(output_d);
}

...全文
2723 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Xiaoweiwei902 2015-05-26
  • 打赏
  • 举报
回复
请问楼主,我在TK1板子上运行关于cufft进行图像处理时怎么比在我自己电脑上还慢呢?而且还慢很多
Mary100860 2015-01-20
  • 打赏
  • 举报
回复
楼主你好,我按照你提供的代码实际运行操作了一遍,发现几个问题,想向你请教一下: 1、在运行的过程中,分配input_c显存失败,请问楼主也遇到这个问题了吗,是怎样解决的呢? 2、在进行傅里叶变换的时候,输入数据是float2类型,为什么不用cufftComplex类型呢? ps:本人小白,学习CUFFT库的使用,谢谢楼主!
nudtzzt 2014-12-16
  • 打赏
  • 举报
回复
楼主你好,小弟最近刚刚开始学习CUDA,想用cufft对多帧图像进行傅里叶变换,能讲解一下cufft2D和cufft3D的区别么?
xiaofeng6896 2014-11-30
  • 打赏
  • 举报
回复
好,赞一个。。。。。。。
伊顺鸣 2014-07-07
  • 打赏
  • 举报
回复
是这样的,,,,,,,,,,
云满笔记 2014-07-04
  • 打赏
  • 举报
回复
FFT? 记得大学的时候被它坑苦了 。。。 支持支持
hugh_z 2014-07-01
  • 打赏
  • 举报
回复
learning
cattpon 2014-07-01
  • 打赏
  • 举报
回复
进来学习一下~
austin9972 2014-07-01
  • 打赏
  • 举报
回复

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧