ice 发表于 2013-9-29 11:25
LZ您好:
1:多次copy的做法不是必须的,您可以一次copy一批数据,计算完以后再整体copy回host端。
我参考了CUFFT手册,有一个疑问手册上没有作说明。下面是手册给出的一维实数到复数的fft模版.
#define NX 256
#define BATCH 10
cufftHandle plan;
cufftComplex *data;
cudaMalloc((void**)&data, sizeof(cufftComplex)*(NX/2+1)*BATCH);
cufftPlan1d(&plan, NX, CUFFT_R2C, BATCH);
...(1)
cufftExecR2C(plan, (cufftReal*)data, data) ;
cudaThreadSynchronize();
...(2)
cufftDestroy(plan);
cudaFree(data);
上面的例子空出了两个地方,第(1)个地方我理解为 把要做FFT的数据(例如float mat[NX])放入data中,可是mat是float型的,长度为NX,而data是复数型的,长度为 (NX/2+1),两者之间不旦数据类型不一样,长度也不一样。数据怎么传输呢?
我写的是 cudaMemcpy(data,mat,sizeof(cufftComplex)*(NX/2+1)*batch,cudaMemcpyHostToDevice);
第(2)个地方我理解为把得到的FFT数据传送回CPU,我声明了一个复数型数组odata[NX/2+1]来接收。
cudaMemcpy(odata,data,sizeof(cufftComplex)*(nf+1)*batch,cudaMemcpyDeviceToHost);
我有4个BATCH,结果发现,运行出来只有第一个BATCH的结果是对的,后面的都不对。有劳您指导一下。
|