2016-06-09 16 views
-2

현재 cuFFT 계획의 최대 128 백만 요소를 극복하기 위해 루프에서 다중 FFT를 실행하려고합니다. 그래서, 예를 들어 루프에서 1 억 2 천 8 백만 요소 실행을 실행합니다.cuFFT 더 큰 일괄 처리 크기를위한 FFT 호출을 반복합니다.

내 프로그램은 단일 FFT 호출에 잘 작동하지만 루핑이 작동하지 않는 것 같습니다. FFT를 어떻게 상쇄했는지 생각할 수 있습니다. 여기 내가 어떻게했는지에 대한 스 니펫이 있습니다 :

cufftComplex *d_signal; 
checkCudaErrors(cudaMalloc((void **)&d_signal, mem_size)); 
cufftComplex *d_filter_kernel; 
checkCudaErrors(cudaMalloc((void **)&d_filter_kernel, mem_size)); 

int rankSize = 2;  
int rank[2]; 
    rank[0] = TempSearchSizeY; rank[1] = TempSearchSizeX;  
int FFTPlanSize = 500; 
cufftHandle planinitial; 
cufftResult r; 
r = cufftPlanMany(&planinitial, rankSize, rank, NULL, 1, 0, NULL, 1, 0, CUFFT_C2C, FFTPlanSize); 
int NrOfFFTRuns = ceil(loadsize/FFTPlanSize); 
int FFTOffset = 0; 

    checkCudaErrors(cudaMemcpy(d_signal, imageNew, sizeof(Complex)*TempSearchArea*loadsize, cudaMemcpyHostToDevice)); 
    checkCudaErrors(cudaMemcpy(d_filter_kernel, tempNew, sizeof(Complex)*TempSearchArea*loadsize, cudaMemcpyHostToDevice)); 


    for (int a = 0; a < NrOfFFTRuns; a++){ 
       FFTOffset = FFTPlanSize*a; 
       r = cufftExecC2C(planinitial, (cufftComplex *)&d_signal[FFTOffset], (cufftComplex *)&d_signal[FFTOffset], CUFFT_FORWARD); 
       PrintFFTPlanStatus(r); 
       r = cufftExecC2C(planinitial, (cufftComplex *)&d_filter_kernel[FFTOffset], (cufftComplex *)&d_filter_kernel[FFTOffset], CUFFT_FORWARD); 
       PrintFFTPlanStatus(r); 
       cout << "Run inital" << endl; 
    { 

위 코드는 잘못된 결과를 반환합니다. 누군가가 문제를 파악하도록 도와 줄 수 있습니까?

+1

을 포함해야 하는가? [mcve]를 포함하십시오. – havogt

+0

죄송합니다.이 코드는 훨씬 더 큰 코드에서 가져 왔습니다. 코드에 순위 초기화를 편집했습니다. 하나의 파일에서 코드를 분리하고 누락 된 부분을 편집 할 수 있는지 확인합니다. 비록 내가 구문 오류로 어딘가에 실패했을 뿐이라고 생각했지만. – LukaK

답변

1

나는 그것을 스스로 알아 냈다.

각 배치의 요소 크기 (TempSearchSizeY * TempSearchSizeX)에 오프셋 값을 곱하는 것을 잊었습니다. 그것은

offset = a * element size * batch size. 

이 경우는

당신이 순위를 초기화 할
offset = a* batch size.