CUDA代码问题

标签 c cuda

在下面的代码中,当我打印“block1”中的“comp1”时,在 Geforce 740M 和 K40 中给出错误但一致的结果。我有一个工作程序可以比较。如果我打印“mult1”,它会给出“Ok”。看来逆FFT 不起作用。

有什么线索吗?

谢谢

路易斯·贡萨尔维斯

main()
{
......

cufftExecZ2Z(plan[1], (cufftDoubleComplex *)comp1,
(cufftDoubleComplex *)comp1, CUFFT_FORWARD);
cudaStreamSynchronize(stream[z5]);



mult1<<<NRSAMPLES/32,32,0,stream[z5]>>>(rrcduo,comp1,z5);
cufftPlan1d(&plan[2], NRSAMPLES, CUFFT_Z2Z, 1);
cufftSetStream(plan[2],stream[z5]);
cudaStreamSynchronize(stream[z5]);



cufftExecZ2Z(plan[2], (cufftDoubleComplex *)comp1,
(cufftDoubleComplex *)comp1, CUFFT_INVERSE);
cudaStreamSynchronize(stream[z5]);


block1<<<NRSAMPLES/32,32,0,stream[z5]>>>(nant, ntaps,nusers,g,tapreal,tapimag,delaytran,comp1,timeuser+NRSAMPLES*(z5*nant));


.....

}

__global__ void mult1(complex1 *rrcduo,complex1 *comp1,int z5)
{
int i1=blockIdx.x * blockDim.x + threadIdx.x;
complex1 const6,const7;

/* if ((z5==0) && (i1==500))

printf("%lf %lf\n",comp1[500].r,comp1[500].i);
*/
const6.r=comp1[i1].r;
const6.i=comp1[i1].i;
const7.r=rrcduo[i1].r;
const7.i=rrcduo[i1].i;
comp1[i1].r=const6.r * (const7.r)-const6.i * (const7.i);
comp1[i1].i=const6.r * (const7.i)+const6.i * (const7.r);
/*  if ((z5==0) && (i1==500))

printf("%lf %lf\n",comp1[500].r,comp1[500].i);*/
}


__global__ void block1(int nant, int ntaps,int nusers,int g,double *tapreal,double *tapimag,int *delaytran,
complex1 *comp1,complex1 *timeuser)
{
int i1=blockIdx.x * blockDim.x + threadIdx.x;
int u1,u2,nr,t1,u3;
complex1 const5,const6,const7;
/* g=z5 in this case*/
if ((g==0) && (i1==500))
printf("%lf %lf\n",(comp1+500)->r,(comp1+500)->i);
//return;

for(nr=0; nr < nant ; nr++)
{
const7.r=0;
const7.i=0;
u3=NRSAMPLES*(nr)+i1;
u1=g*ntaps+nr*nusers*ntaps;
for(t1=0;t1 < ntaps;t1++)
{

const5.r=tapreal[u1+t1];
const5.i=tapimag[u1+t1];
u2=delaytran[u1+t1];
if ((i1-u2)>=0)
{
const6.r=comp1[i1-u2].r;
const6.i=comp1[i1-u2].i;
const7.r+=(const6.r)*const5.r-(const6.i)*const5.i;
const7.i+=(const6.r)*const5.i+(const6.i)*const5.r;
}
}
timeuser[u3].r=const7.r;
timeuser[u3].i=const7.i;

}//Nrantennas
if ((g==0) && (i1==500))
printf("%lf %lf\n",timeuser[500].r,timeuser[500].i);
}

最佳答案

已解决。逆 FFT 中的 cuFFT 不会像 MATLAB 那样将结果除以变换的维数。在本例中为 1/NR样本。

关于CUDA代码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27607269/

相关文章:

c - O(n^2) 的时间复杂度

控制可能到达 C 中非 void 函数的末尾

CUDA 5.0 : CUBIN and CUBLAS_device, 计算能力 3.5

ubuntu - 安装TensorFlow,Ubuntu上的cuda home在哪里?

objective-c - 从 PDF 流上的 TJ 回调生成的 CGPDFArray 中复制 CGPDFStrings

c - 我可以使用什么作为 select() 的文件描述符的 stub

c++ - CUDA内存错误

cuda - 如何将推力::device_vector <int>转换到原始指针

matlab - 从 Matlab CSC 到 CSR 格式的转换

c - for 循环中的空语句 VS 无限 while