版主:您好!
我刚接触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遇到问题需要关闭。我们对此引起的不便表示抱歉。
如果您正处于进程当中,信息有可能丢失。
……………………………………….
调试 发送错误报告 不发送
请问版主,这是我程序编写的有问题,还是哪方面的原因?
在此谢谢。