как сделать нулевое заполнение в CUDA для covolution

привет, мне нужно свернуть два сигнала [pulseMatrixRow[i] и pulse[i]] с помощью CUFFT. для этого мой код int main(int argc, char **argv)

{
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;

 }

мой код pulseMatrix, сгенерированный Matlab, имеет вид:

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

но я должен обрабатывать только 1000 образцов pulseMatrixRow за один раз и отдыхать как набор из 1000 один за другим. Поскольку мой fft равен 1024, расскажите, пожалуйста, как и на каком этапе мне нужно дополнить нулями в конце моего входного сигнала и для моего сигнала фильтра, который просто задается как импульс = [единицы (1,50) нули (1500- 50)];


person Ani    schedule 24.01.2013    source источник
comment
Кажется, это вопрос теории обработки сигналов/БПФ/ДПФ, а не вопрос программирования/библиотеки CUDA. Я думаю, вы можете установить конечные 24 элемента d_signal и конечные 524 элемента d_filter_signal равными нулю, прежде чем выполнять fft.   -  person kangshiyin    schedule 24.01.2013
comment
да сэр, но я новичок в программировании, подскажите пожалуйста как обнулить элементы и на каком этапе.......   -  person Ani    schedule 24.01.2013


Ответы (1)


Вы можете использовать memset() для обнуления заполнения памяти хоста перед его передачей в память устройства или

вы можете использовать cudaMemset() для обнуления заполнения памяти устройства перед выполнением fft и после передачи хоста в память устройства.

Перейдите по этой ссылке, чтобы узнать, как использовать memset().

Перейдите по этой ссылке, чтобы узнать, как использовать cudaMemset().

person kangshiyin    schedule 24.01.2013
comment
сэр, в основном я пытался использовать эту команду, но, насколько мне известно, она используется для установки определенных определенных значений на ноль, например, если я передаю 100 образцов, она используется для установки значений из этих 100 только на ноль. но если мне нужно передать 100 значений, а затем добавить 24 нуля в конце, что делать? - person Ani; 24.01.2013
comment
@Ankit, вы можете рассчитать начальный адрес 24 элементов, а затем передать его memset() вот так memset(&array[1000], 0, 24*sizeof(array[0])); - person kangshiyin; 24.01.2013
comment
сэр, с помощью этой команды моя первая тысяча значений становится нулевой, а следующие 24 - все 1. - person Ani; 24.01.2013
comment
@Ankit Извините, я не могу сказать, что не так, без дополнительной информации. Вы можете опубликовать свой полный код, чтобы другие увидели, правильно ли вы используете memset(). - person kangshiyin; 24.01.2013