0
votes

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

2
When and where does the error occur? - Sebastian Dressler
Note that cudaThreadExit() has been deprecated in favour of cudaDeviceReset(), see this document - Vitality
I have a GTX 650 Ti boost that has 2 GB RAM. I build and run samples in same machine (first in windows 7 & visual studio 2010 then in ubuntu 12.04) when i set Nx = 1024 & Batch = 90000 nsight eclipse has an CUFFT_ALLOC_FAILED error but in visual studio i run it without any errors! - user1210922

2 Answers

3
votes

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();

} 
1
votes

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()