CUDA代码问题

CUDA代码问题,c,cuda,C,Cuda,在下面的代码中,当我在“block1”中打印“comp1”,并在Geforce 740M和K40中给出错误但一致的结果时。我有一个工作程序要比较。如果我打印“mult1”,它会给出Ok。似乎逆FFT不起作用 有什么线索吗 谢谢 路易斯·冈萨尔维斯 main() { ...... cufftExecZ2Z(plan[1], (cufftDoubleComplex *)comp1, (cufftDoubleComplex *)comp1, CUFFT_FORWARD); cudaStreamSyn

在下面的代码中,当我在“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);
}
main()
{
......
cufftExecZ2Z(平面图[1],(cufftDoubleComplex*)comp1,
(袖口双复体*)复体1,袖口向前);
cudaStreamSynchronize(流[z5]);
mult1(rrcduo,comp1,z5);
袖口平面图(和平面图[2],NRSAMPLES,袖口平面图,1);
cufftSetStream(平面图[2],溪流[z5]);
cudaStreamSynchronize(流[z5]);
cufftExecZ2Z(平面图[2],(CufftDupleComplex*)comp1,
(CUFFT双复数*)复数1,CUFFT_倒数);
cudaStreamSynchronize(流[z5]);
区块1(nant、NTAP、nusers、g、tapreal、tapimag、delaytran、comp1、timeuser+NRSAMPLES*(z5*nant));
.....
}
__全局无效mult1(complex1*rrcduo,complex1*comp1,int z5)
{
inti1=blockIdx.x*blockDim.x+threadIdx.x;
复合物1常数6,常数7;
/*如果((z5==0)和&(i1==500))
printf(“%lf%lf\n”,comp1[500].r,comp1[500].i);
*/
常数6.r=comp1[i1].r;
常数6.i=comp1[i1].i;
const7.r=rrcduo[i1].r;
常数7.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);
/*如果((z5==0)和&(i1==500))
printf(“%lf%lf\n”,comp1[500].r,comp1[500].i)*/
}
__全局无效块1(int-nant、int-ntaps、int-nusers、int-g、double*tapreal、double*tapimag、int*delaytran、,
complex1*comp1,complex1*timeuser)
{
inti1=blockIdx.x*blockDim.x+threadIdx.x;
int u1、u2、nr、t1、u3;
复合物1常数5、常数6、常数7;
/*在这种情况下,g=z5*/
如果((g==0)和&(i1==500))
printf(“%lf%lf\n”),(comp1+500)->r,(comp1+500)->i;
//返回;
对于(nr=0;nr=0)
{
常数6.r=comp1[i1-u2].r;
常数6.i=comp1[i1-u2].i;
常数7.r+=(常数6.r)*常数5.r-(常数6.i)*常数5.i;
常数7.i+=(常数6.r)*常数5.i+(常数6.i)*常数5.r;
}
}
timeuser[u3].r=const7.r;
timeuser[u3].i=const7.i;
}//NR天线
如果((g==0)和&(i1==500))
printf(“%lf%lf\n”,timeuser[500].r,timeuser[500].i);
}

已解决。逆FFT中的cuFFT与通常的MATLAB一样,不将结果除以变换的维数。在这种情况下,通过1/nR样品

因此,对于像这样的问题(“为什么这段代码不起作用?”),您需要提供一个。它应该是其他人可以复制、粘贴、编译和运行的东西,而无需添加或更改任何内容,并且可以看到错误。主机代码位于“#omp parallel num_threads(16)”中,每个OpenMP线程都有一个流。“comp1”是一个图形内存阵列,每个OpenMP线程有一个。