2016-06-09 7 views
-2

В настоящее время я пытаюсь запустить несколько своих FFT в цикле, чтобы преодолеть 128 миллионов элементов max плана cuFFT. Так, например, я бы выполнил 128 миллионов прогонов элементов в цикле.cuFFT зацикленные вызовы 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.