как да направите Zero pading в 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., моля, кажете как и на кой етап трябва да поставя нулите в края на моя входен сигнал и за моя филтърен сигнал, който просто се дава като импулс = [ones(1,50) нули(1500- 50)];


person Ani    schedule 24.01.2013    source източник
comment
Изглежда по-скоро въпрос на обработка на сигнала/FFT/DFT теория, отколкото въпрос на програмиране/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 са всички 1s. - person Ani; 24.01.2013
comment
@Ankit Съжалявам, че не мога да кажа какво не е наред без повече информация. Можете да публикувате пълния си код, за да позволите на другите да видят дали използвате memset() по правилния начин. - person kangshiyin; 24.01.2013