【问题标题】:CUDA code IssueCUDA 代码问题
【发布时间】:2015-02-20 19:44:40
【问题描述】:

在下面的代码中,当我在“block1”中打印“comp1”并给出错误但在 Geforce 740M 和 K40 中始终如一。我有一个工作程序可以比较。如果我在“mult1”中打印,它会给出好的。似乎逆 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);
}

【问题讨论】:

  • SO expects,对于诸如此类的问题(“为什么这段代码不起作用?”),您提供一个 MCVE。它应该是其他人可以复制、粘贴、编译和运行的东西,无需添加任何内容或更改任何内容,并查看错误。
  • 主机代码在“#omp parallel num_threads(16)”内,每个 OpenMP 线程都有一个流。 "comp1" 一个图形内存数组,每个 OpenMP 线程都有一个。

标签: c cuda


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多