如何在CUDA中进行零焊盘处理以获得新的解决方案

如何在CUDA中进行零焊盘处理以获得新的解决方案,cuda,padding,zero,convolution,Cuda,Padding,Zero,Convolution,嗨,我必须使用CUFFT卷积两个信号[pulseMatrixRow[i]和脉冲[i]]。因此,我的代码是 int main(int argc,字符**argv) 但我一次只需要处理1000个PulseMatrix Row样本,其余的一组一个地处理1000个样本。 由于我的fft是1024,请告诉我如何以及在哪个阶段我必须在输入信号的末尾填充零,对于我的滤波器信号,它简单地给出为 脉冲=[一(1,50)个零(1500-50)] 您可以使用memset()将主机mem的填充归零,然后再将其传输到设备

嗨,我必须使用CUFFT卷积两个信号[pulseMatrixRow[i]和脉冲[i]]。因此,我的代码是 int main(int argc,字符**argv)

但我一次只需要处理1000个PulseMatrix Row样本,其余的一组一个地处理1000个样本。 由于我的fft是1024,请告诉我如何以及在哪个阶段我必须在输入信号的末尾填充零,对于我的滤波器信号,它简单地给出为 脉冲=[一(1,50)个零(1500-50)]

您可以使用
memset()
将主机mem的填充归零,然后再将其传输到设备mem,或者

在进行fft之前和主机到设备内存传输之后,可以使用
cudaMemset()
将设备内存的填充归零

有关如何使用
memset()
,请参阅


有关如何使用
cudaMemset()

的信息,请参阅。这似乎是信号处理/FFT/DFT理论的问题,而不是编程/CUDA库的问题。在进行fft之前,我想您可以将
d_信号
的后面24个元素和
d_滤波器
信号的后面524个元素设置为零。是的,先生,但我不熟悉编程,请告诉我如何将元素设置为零以及在什么阶段……。先生,基本上我尝试使用这个命令,但据我所知,它用于将某些定义的值设置为零,就像我传递100个样本一样,它用于将该100个样本的值仅设置为零。但是,如果我必须传递100个值,然后在其末尾填充24个零,该怎么办?@Ankit您可以计算24个元素的起始地址,然后将其传递给
memset()
像这样
memset(&array[1000],0,24*sizeof(array[0])先生,通过使用此命令,我的前1000个值将变为零,接下来的24个值都是1。@Ankit抱歉,如果没有更多信息,我无法判断是什么问题。您可以发布完整的代码,让其他人看到您是否正确使用了
memset()
{
FILE *fileWritePtr;
cufftComplex h_signal[NX*BATCH];
cufftComplex h_filter_signal[NX*BATCH];
cufftComplex hf_signal[NX*BATCH];   

// Initalize the memory for the signal
for (unsigned int i = 0; i < SIGNAL_SIZE; ++i)
{
    h_signal[i].x = pulseMatrixRow[i];
    h_signal[i].y = pulseMatrixRow[i];
}

// device memory allocation 
    cudaMalloc((void**)&d_signal, sizeof(cufftComplex)*NX*BATCH);

// transfer to device memory
cudaMemcpy(d_signal, h_signal, sizeof(cufftComplex)*NX*BATCH, cudaMemcpyHostToDevice);



// Initalize the memory for the filter
for (unsigned int i = 0; i < FILTER_signal_SIZE; ++i)

{
    h_filter_signal[i].x = pulse[i];
    h_filter_signal[i].y = pulse[i];
}


// device memory allocation 
    cudaMalloc((void**)&d_filter_signal, sizeof(cufftComplex)*NX*BATCH);

// transfer to device memory
   cudaMemcpy(d_filter_signal, h_filter_signal, sizeof(cufftComplex)*NX*BATCH,         cudaMemcpyHostToDevice);

  // CUFFT plan

  cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);

  // Transform signal and fsignal

 printf("Transforming signal cufftExecC2C\n");
  cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal,     CUFFT_FORWARD);


printf("Transforming filter_signal cufftExecC2C\n");
cufftExecC2C(plan, (cufftComplex *)d_filter_signal, (cufftComplex     *)d_filter_signal, CUFFT_FORWARD);



// Multiply the coefficients together 
ComplexPointwiseMulAndScale<<<blocksPerGrid, threadsPerBlock>>>(d_signal, d_filter_signal, NX, 1.0f/NX*BATCH);


// Transform signal back
printf("Transforming signal back cufftExecC2C\n");
cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE);



// transfer results from GPU memory 


cudaMemcpy(hf_signal, d_signal, sizeof(cufftComplex)*NX*BATCH,cudaMemcpyDeviceToHost);


fileWritePtr = fopen("OutputData1.txt","w+");

for(i = 0; i < NX ; i++){
    //printf("%f %f\n", i, hf_signal[i].x, hf_signal[i].y);
     fprintf(fileWritePtr,"%d %f %f\n", i, hf_signal[i].x, hf_signal[i].y);
     }
fclose(fileWritePtr);



//Destroy CUFFT context
cufftDestroy(plan);

 // cleanup memory
 cudaFree(d_signal);
 cudaFree(d_filter_signal);


 // free(h_signal);
 // free(h_filter_signal);

return 0;

 }
pulse = [ones(1,50) zeros(1,500-50)];
pulseMatrix = repmat(pulse,10,1);
pulseMatrix = pulseMatrix.';
pulseMatrixRow = pulseMatrix(:);