简体   繁体   中英

CUFFT_ALLOC_FAILED Error in nsight eclipse

I wrote a simple cuda file that successfully build in visual studio 2010 & nsight eclipse

the code is here

#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);
}

I changed NX & BATCH four times for example with

const int NX = 1024;

const int BATCH = 90000;

const int SIGNAL_SIZE = NX * BATCH;

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

I successfully run Sample in visual studio 2010 & 2012 (windows 7 64 bit) but in ubuntu 12.04 (32 bit) nsight eclipse give this Error

CUFFT_ALLOC_FAILED

for cufftPlan1d function

I change BATCH to 80000 (NX = 1024) & this error occurred in ubuntu but in visual studio 2010 i run without any errors!

I use Cuda toolkit 5.5 that has this feature:

Transform sizes up to 128 million elements in single precision

and 80000 * 1024 = 81920000 elements < 128 million elements

I change BATCH to 8000 (NX = 1024) & that error does not occured in ubuntu

Please Help Me

thanks

You can estimate the amount of memory required by your cuFFT call using 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();

} 

CUFFT Documentation: http://docs.nvidia.com/cuda/cufft/#function-cufftplan1d

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

Meaning cufftPlan1d() was not able to allocate memory on the GPU, likely because there is not enough free memory. The available VRAM would not have changed between operating systems, so either you don't have the right drivers for your card or you're running Ubuntu on a separate machine with a GPU that has limited VRAM. You can check the available global memory with cudaGetDeviceProperties()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM