CUFFT_ALLOC_FAILED Ошибка в nsight eclipse

0

Я написал простой файл cuda, который успешно создает в visual studio 2010 & nsight eclipse

код здесь

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#include <cufft.h>
#include <cutil_inline.h>

typedef float2 Complex; 

int main(int argc, char** argv) 
{
     const int NX = 1024;

 const int BATCH = 90000;

     const int SIGNAL_SIZE = NX * BATCH;

     Complex* h_signal = (Complex*)malloc(sizeof(Complex) * SIGNAL_SIZE);

     for (unsigned int i = 0; i < SIGNAL_SIZE; ++i) {
    h_signal[i].x = rand() / (float)RAND_MAX;
    h_signal[i].y = 0;
}

Complex* d_signal;
cutilSafeCall(cudaMalloc((void**)&d_signal, sizeof(Complex)*SIGNAL_SIZE));


cutilSafeCall(cudaMemcpy(d_signal, h_signal, sizeof(Complex)*SIGNAL_SIZE,
                          cudaMemcpyHostToDevice));

cufftHandle plan;
cufftSafeCall(cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH));


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

cutilSafeCall(cudaMemcpy(h_signal, d_signal, SIGNAL_SIZE*sizeof(Complex),
                          cudaMemcpyDeviceToHost));

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

// cleanup memory
free(h_signal);
cutilSafeCall(cudaFree(d_signal));

cudaThreadExit();

 cutilExit(argc, argv);
}

Я изменил NX & BATCH четыре раза, например, с помощью

const int NX = 1024;

const int BATCH = 90000;

const int SIGNAL_SIZE = NX * BATCH;

cufftHandle plan;
cufftPlan1d(&plan, NX, CUFFT_C2C, BATCH);

Я успешно запускаю Sample в visual studio 2010 и 2012 (Windows 7 64 бит), но в ubuntu 12.04 (32 бит) nsight eclipse дает эту ошибку

CUFFT_ALLOC_FAILED

для функции cufftPlan1d

Я меняю BATCH на 80000 (NX = 1024), и эта ошибка произошла в ubuntu, но в Visual Studio 2010 я запускаю без ошибок!

Я использую Cuda toolkit 5.5, который имеет эту функцию:

Преобразование размеров до 128 миллионов элементов в одной точности

и 80000 * 1024 = 81920000 элементов <128 миллионов элементов

Я меняю BATCH на 8000 (NX = 1024) и эта ошибка не возникает в ubuntu

Пожалуйста помогите

благодаря

  • 0
    Когда и где возникает ошибка?
  • 0
    Обратите внимание, что cudaThreadExit() устарела в пользу cudaDeviceReset() , см. Этот документ
Показать ещё 1 комментарий
Теги:
cuda
gpu

2 ответа

3

Вы можете оценить объем памяти, необходимый для вашего вызова cufftEstimate1d используя cufftEstimate1d.

#include <conio.h>

#include <cufft.h>

#define cufftSafeCall(err)      __cufftSafeCall(err, __FILE__, __LINE__)
inline void __cufftSafeCall(cufftResult err, const char *file, const int line)
{
    if( CUFFT_SUCCESS != err) {
    fprintf(stderr, "cufftSafeCall() CUFFT error in file <%s>, line %i.\n",
        file, line);
    getch(); exit(-1);
    }
}


int main() {

    const int NX = 1024;

    const int BATCH = 100000;

    size_t workSize;

    cufftSafeCall(cufftEstimate1d(NX, CUFFT_C2C, BATCH, &workSize));

    printf("%i\n",workSize);

    getchar();

} 
1

Документация CUFFT: http://docs.nvidia.com/cuda/cufft/#function-cufftplan1d

CUFFT_ALLOC_FAILED: The allocation of GPU resources for the plan failed.

Значение cufftPlan1d() не удалось выделить память на GPU, вероятно, из-за нехватки свободной памяти. Доступный VRAM не изменился бы между операционными системами, так что либо у вас нет правильных драйверов для вашей карты, либо вы используете Ubuntu на отдельной машине с графическим процессором с ограниченным VRAM. Вы можете проверить доступную глобальную память cudaGetDeviceProperties()

  • 0
    Я использовал ту же машину. я думаю, что у водителя нет проблем, потому что все образцы cuda создаются и работают успешно!
  • 0
    Я думаю, что распределение GPU отличается в 32-битной и 64-битной это правда?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню