2013-09-25 2 views
1

Я пишу программу, которая используется для обработки сигнала GPS с помощью CUDA. Поэтому мне нужно использовать fft, но произошла ошибка.ERROR "code = 2 (CUFFT_ALLOC_FAILED)" во время вызова функции FFT CUDA

CUDA error at F:/clouddrive kingsoft/acc/accfinal/accfinal/acc.cu:341 code=2(CUF 
FT_ALLOC_FAILED) "cufftPlan1d(&plan, new_size, CUFFT_C2C, 1)" 

и код здесь.

double fft_Ifft_Sum(Complex *h_signal,Complex *h_filter_kernel,double* list,bool firstEnter) 
{ 
    double max=0; 
    int new_size=samplesPerCode; 
    int mem_size = sizeof(Complex) * new_size; 

    // Allocate device memory for signal 
    Complex *d_signal; 
    checkCudaErrors(cudaMalloc((void **)&d_signal, mem_size)); 
    // Copy host memory to device 
    checkCudaErrors(cudaMemcpy(d_signal, h_signal, mem_size,cudaMemcpyHostToDevice)); 

    // Allocate device memory for filter kernel 
    if(firstEnter) 
    { 
    checkCudaErrors(cudaFree(d_filter_kernel)); 
    checkCudaErrors(cudaMalloc((void **)&d_filter_kernel, mem_size)); 

    checkCudaErrors(cudaMemcpy(d_filter_kernel, h_filter_kernel, mem_size, 
           cudaMemcpyHostToDevice)); 
    } 

    // CUFFT plan 
    cufftHandle plan; 
    checkCudaErrors(cufftPlan1d(&plan, new_size, CUFFT_C2C, 1)); 

    // Transform signal and kernel 

    checkCudaErrors(cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_FORWARD)); 

    ComplexPointwiseMulAndScale_p<<<1024, 1024>>>(d_signal, d_filter_kernel, new_size, 1.0f/new_size); 
// Check if kernel execution generated and error 
    getLastCudaError("Kernel execution failed [ ComplexPointwiseMulAndScale ]"); 

    // Transform signal back 
    //printf("Transforming signal back cufftExecC2C\n"); 
    checkCudaErrors(cufftExecC2C(plan, (cufftComplex *)d_signal, (cufftComplex *)d_signal, CUFFT_INVERSE)); 
    cudaThreadSynchronize(); 

    // Copy device memory to host 
    Complex *h_convolved_signal = h_signal; 
    checkCudaErrors(cudaMemcpy(h_convolved_signal, d_signal, mem_size, 

         cudaMemcpyDeviceToHost)); 
    // list=new double[new_size]; 
    for(int i=0;i<new_size;i++) 
    { 
     list[i]=h_convolved_signal[i].x*h_convolved_signal[i].x+h_convolved_signal[i].y*h_convolved_signal[i].y; 
     if(list[i]>max)max=list[i]; 
    } 


    return max; 



    //Destroy CUFFT context 
    checkCudaErrors(cufftDestroy(plan)); 

    // cleanup memory 
    free(h_signal); 
    free(h_filter_kernel); 


    checkCudaErrors(cudaFree(d_signal)); 
    checkCudaErrors(cudaFree(d_filter_kernel)); 
    cudaDeviceReset(); 
} 

и эта функция будет вызвана в основном для около 1900 раз, и это не может работать гладко, пока о 1440 раз, то произойдет ошибка here.I не может понять, почему. спасибо.

+0

Похоже, что у вас заканчивается память. Вы должны проверить свою программу на выделение памяти GPU, которые не освобождаются в цикле. Обратите внимание, что SO ожидает: «Вопросы, связанные с проблемами с написанным кодом, должны описывать конкретную проблему и включать в себя действительный код для ее воспроизведения - в самом вопросе. См. SSCCE.org для руководства.« Вы не предоставили SSCCE. org код. Голосование закрывается. Заметьте, что я не прошу вас сбрасывать всю вашу программу где-то. Создайте небольшой проигрыватель - он не должен требовать гораздо больше того, что вы показали здесь. –

+0

Извините, я новичок. И я обращу внимание на это в следующий раз. Спасибо за ваш совет! – kururu

ответ

1

Каждый раз, когда вы вводите функцию, вы выделяете память устройства на d_signal, но не освобождаете его. У вас есть оператор return в вашей функции до любого из операций free или уничтожения, так что это выглядит проблемой для меня, если вы вызываете эту функцию повторно.

Я бы подумал, что компилятор будет выплевывать предупреждение о недоступном коде, также, основываясь на том, что вы показали.

+0

Я двигаюсь свободно за возвращаемым значением и исправляю проблему, большое вам спасибо! – kururu