生成解决方案无误,编译无法通过

版主:您好!
我刚接触CUDA不久,编写了一个程序,其目的:A与B两个都是二维数组,A[32][size],B[32][size],分别对A和B中的数据做FFT变换,然后对A与B实现行—行相乘,实现过程中自己编写了内核函数,编译无法通过。关键代码如下:
void Multiphase_filter(Complex* host_signal_1,Complex* host_filter_1)
{
//为信号分配显存空间
Complex *d_signal;
cudaMalloc((void **)&d_signal, sizeof(Complex)32size);
cudaMemcpy(d_signal, host_signal_1, sizeof(Complex)32size,cudaMemcpyHostToDevice);

//为滤波器系数分配显存空间
Complex *d_filter;
cudaMalloc((void **)&d_filter, sizeof(Complex)*32*size);
cudaMemcpy(d_filter, host_filter_1, sizeof(Complex)*32*size,cudaMemcpyHostToDevice);

Complex * temporary_signal;
cudaMalloc((void **)&temporary_signal, sizeof(Complex)*32*size);
memset(temporary_signal,0,32*size*sizeof(Complex));
Complex * temporary_filter;
cudaMalloc((void **)&temporary_filter, sizeof(Complex)*32*size);
memset(temporary_filter,0,32*size*sizeof(Complex));

// 对信号与滤波器系数进行FFT变换
cufftHandle plan;
cufftPlan1d(&plan, 32size, CUFFT_C2C, 1);
cufftExecC2C(plan, (cufftComplex
)d_signal, (cufftComplex )d_signal, CUFFT_FORWARD);
cufftExecC2C(plan, (cufftComplex
)d_filter, (cufftComplex *)d_filter, CUFFT_FORWARD);

//FFT之后的数据采用GPU并行处理
dim3 dimBlock(256,1);
dim3 dimGrid((new_size+dimBlock.x-1)/dimBlock.x,(channel_num14+dimBlock.y-1)/dimBlock.y);
PointwiseMulAndScale<<<dimGrid,dimBlock>>>(d_signal,d_filter,temporary_signal,temporary_filter,size,1.0f/size);


}

以下是自己编写的内核函数:
//频域相乘的内核函数
static__global__ void ComplexPointwiseMulAndScale(Complex* a,Complex* b,Complex* c,Complex* d, int size1, float scale)
{ const int block_y = blockIdx.y;
const int threadIDx = blockIdx.x * blockDim.x + threadIdx.x;
//每行的起始地址与结束地址
int begin=block_ysize1sizeof(Complex);
//每行的结束地址
int end=begin+size1-1;

for (int i=begin;i<end;i++)
{ c[i]=a[i];d[i]=b[i];
for (int g = threadIDx; g < size1; g ++)
{
c[g] = ComplexScale(ComplexMul(c[g], d[g]), scale);
}
}
}

出现的错误如下(是一个窗口,我把它改成文字叙述):

Channelized.exe遇到问题需要关闭。我们对此引起的不便表示抱歉。

如果您正处于进程当中,信息有可能丢失。

……………………………………….

调试 发送错误报告 不发送

请问版主,这是我程序编写的有问题,还是哪方面的原因?

在此谢谢。

LZ您好:

这个一般是您代码写的有问题,因为您的代码中部分字符被论坛作为转义字符吞掉了,所以无法直接看了,请您用代码模式发代码。

以及根据目前显示出来的情况看,您的kernel问题挺多,以及,您也可以用nsight自己调试一下。

祝您好运~

ice版主,谢谢您了!我的kernel问题是很多,但是想了好久,也没有想出啥方法。所以恳请版主帮我看下,问题出在什么地方。

void Multiphase_filter(Complex* host_signal_1,Complex* host_filter_1)
{
   //为信号分配显存空间
   Complex *d_signal;
   cudaMalloc((void **)&d_signal, sizeof(Complex)*32*size);
   cudaMemcpy(d_signal, host_signal_1, sizeof(Complex)*32*size,cudaMemcpyHostToDevice);
   
   //为滤波器系数分配显存空间
   Complex *d_filter;
   cudaMalloc((void **)&d_filter, sizeof(Complex)*32*size);
   cudaMemcpy(d_filter, host_filter_1, sizeof(Complex)*32*size,cudaMemcpyHostToDevice);
   
   Complex * temporary_signal;
   cudaMalloc((void **)&temporary_signal, sizeof(Complex)*32*size);
   memset(temporary_signal,0,32*size*sizeof(Complex));
   Complex * temporary_filter;
   cudaMalloc((void **)&temporary_filter, sizeof(Complex)*32*size);
   memset(temporary_filter,0,32*size*sizeof(Complex));
   

   // 对信号与滤波器系数进行FFT变换
   cufftHandle plan;
   cufftPlan1d(&plan, 32*size, CUFFT_C2C, 1);
   cufftExecC2C(plan, (cufftComplex*)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD);
   cufftExecC2C(plan, (cufftComplex*)d_filter, (cufftComplex *)d_filter, CUFFT_FORWARD);

   //FFT之后的数据采用GPU并行处理
   dim3 dimBlock(256,1);
   dim3 dimGrid((new_size+dimBlock.x-1)/dimBlock.x,(channel_num14+dimBlock.y-1)/dimBlock.y);
   PointwiseMulAndScale<<<dimGrid,dimBlock>>>(d_signal,d_filter,temporary_signal,temporary_filter,size,1.0f/size);

   ...........
}


以下是自己编写的内核函数:
//频域相乘的内核函数
static__global__ void ComplexPointwiseMulAndScale(Complex* a,Complex* b,Complex* c,Complex* d, int size1, float scale)
{      const int block_y = blockIdx.y;
   const int threadIDx = blockIdx.x * blockDim.x + threadIdx.x;
   //每行的起始地址与结束地址
   int begin=block_y*size1*sizeof(Complex);
   //每行的结束地址
   int end=begin+size1-1;
   
   for (int i=begin;i<end;i++)
   {     c=a;d=b;
   for (int g = threadIDx; g < size1; g ++)  
   {
   c[g] = ComplexScale(ComplexMul(c[g], d[g]), scale);
   }
   }
}

LZ您好:

1:您这个问题不叫“编译无法通过”,您这个是执行过程中的问题。

2:您的kernel代码问题很多比较明显的有:
a) 您所有的block都在计算同一行数据,您的计算过程是是对c[g]赋值的,是从d[g]读取的。其中c=a,d=b得到值,这些都是global数组的初始地址,而您寻址中使用的g又仅和本block的局部index有关,所以,全部的计算都在第一行里面进行。
您计算得到的每行开始和结束的地址,并没有参与进您的寻址。

b)按照您的文字叙述,您只需要每个线程完成一组相乘即可,但是您的实现中每个线程跑了多个循环。这明显是不正确的。

综上,请LZ学习并领会CUDA编程的基本概念,然后再着手撰写代码。
以及,上述仅仅指出两处问题,并不代表仅有这两处问题,可能还有其他问题。

祝您好运~

谢谢版主,明天参阅相关书籍加以修改,基础薄弱,想了许久还是没有解决,呵呵。

不客气的,欢迎您在用知识重新武装之后,再度杀回论坛参与讨论~

版主,我还想问个问题,我现在的课题是不是能可以并行的??只是写的程序有问题??
打扰您了,版主。

您应该先想清楚这个问题,才设计算法和写代码的,亲~
您不妨想想看,会有收益的。

祝您好运~