2013-01-24 2 views
0

) 안녕하세요. CUFFT를 사용하여 [pulseMatrixRow [i]와 pulse [i] 두 신호를 컨벌루션해야합니다. 내 코드는 INT 주요임을위한 (INT의는 argc, 문자 ** argv를)CUDA에서 제로 패딩을하는 방법 (

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

} 
MATLAB에 의해 생성

내 pulseMatrix 코드는 다음과 같이 주어진다 :

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

하지만 난의 1000 샘플을 처리 할 필요가 pulseMatrixRow를 한 번에 1000 개씩 하나씩 설정합니다. 내 fft가 1024이므로 제 입력 신호의 끝에 0을 채우고 내 필터 신호를 단순히 0으로 채우는 방법과 단계를 알려주십시오. pulse = [ones (1,50) 0 1,500-50)];

+0

프로그래밍/CUDA 라이브러리의 문제보다는 신호 처리/FFT/DFT 이론의 문제로 보입니다. 나는 fft를하기 전에'd_signal'의 후행 24 개 요소와'd_filter_signal'의 후행 524 개 요소를 0으로 설정할 수 있다고 생각합니다. – kangshiyin

+0

네,하지만 프로그래밍에 익숙하지 않은 요소를 0 단계로 설정하는 방법을 알려주십시오. – Ani

답변

1
당신은 장치 MEM에 transfering하기 전에, 호스트 (MEM)의 패딩을 제로로 memset()을 사용할 수

, 또는

당신은 FFT를 수행하기 전에와의 호스트 후, 장치 (MEM)의 패딩을 제로로 cudaMemset()를 사용할 수 있습니다 장치 메모리 전송.

memset() 사용 방법은 this link을 참조하십시오.

cudaMemset() 사용 방법은 this link을 참조하십시오.

+0

선생님, 기본적으로이 명령을 사용하려고했지만 내 지식에 따라 사용합니다. 특정 정의 된 값을 0으로 설정합니다. 예를 들어 100 개의 샘플을 통과하는 경우처럼 값을 100으로 설정하는 데 사용됩니다. 하지만 내가 100 개의 값을 전달하고 그 끝에 24 개의 0을 채워야한다면 어떻게해야할까요? – Ani

+0

@Ankit 당신은 24 엘레멘트의 시작 주소를 계산할 수 있고 다음과 같이'memset (& array [1000], 0, 24 * sizeof (array [0]));' – kangshiyin

+0

sir, 이 명령을 사용하면 첫 번째 천 값은 0이되고 다음 24는 모두 1이됩니다. – Ani