strange values for cudaMemGetInfo
I'm getting different values for the total memory on calls to cudaMemGetInfo after allocating memory.
It should be be noted that i am running this via the matlab mex interface, perhaps this has something to do with it?

This code is executed inside a matlab for loop from 0 to 511
[code]
...
/* Check GPU memory before allocation. */
size_t freeMemBefore = 0;
size_t totalMem = 0;
size_t freeMemAfterAlloc = 0;
size_t freeMemAfterFree = 0;

mexPrintf("* Memory available before allocation.\n");
cudaMemGetInfo(&freeMemBefore, &totalMem);
mexPrintf("Total GPU memory: %lu\n",&totalMem);
mexPrintf("GPU memory available: %lu\n",&freeMemBefore);

/* Pointers for the device memory */
float *a;
double *b;
float *c, *d; // Complex

/* Allocate memory on the device */
cudaMalloc( (void **) &a, sizeof(float)*999);
cudaMalloc( (void **) &b, sizeof(double)*999);

cudaMalloc( (void **) &c, sizeof(double)*512);
cudaMalloc( (void **) &d, sizeof(double)*512);

mexPrintf("** Memory available after allocation.\n");
cudaMemGetInfo(&freeMemAfterAlloc, &totalMem);
mexPrintf("Total GPU memory: %lu\n",totalMem);
mexPrintf("GPU memory available: %lu, Consumed: %lu\n",freeMemAfterAlloc,(freeMemBefore - freeMemAfterAlloc));

... some cudaMemcpy's (cudaMemcpyHostToDevice) here ...

... launch kernel here ...

... some cudaMemcpy's (cudaMemcpyDeviceToHost) here ...

... cudaFree(a, b,c,d) here ...


mexPrintf("*** Memory available after free'ing.\n");
cudaMemGetInfo(&freeMemAfterFree, &totalMem);
mexPrintf("Total GPU memory: %lu\n",totalMem);
mexPrintf("GPU memory available: %lu\n\n",freeMemAfterFree);

return;

[/code]

results:
index = 0
* Memory available before allocation.
Total GPU memory: 68245376
GPU memory available: 68245400
** Memory available after allocation.
Total GPU memory: 2818572288
GPU memory available: 2331492352, Consumed: 2097152
*** Memory available after free'ing.
Total GPU memory: 2818572288
GPU memory available: 2331492352

index = 1
* Memory available before allocation.
Total GPU memory: 68245376
GPU memory available: 68245400
** Memory available after allocation.
Total GPU memory: 2818572288
GPU memory available: 2331492352, Consumed: 0
*** Memory available after free'ing.
Total GPU memory: 2818572288
GPU memory available: 2331492352

index = 2
* Memory available before allocation.
Total GPU memory: 68251232
GPU memory available: 68251256
** Memory available after allocation.
Total GPU memory: 2818572288
GPU memory available: 2331492352, Consumed: 0
*** Memory available after free'ing.
Total GPU memory: 2818572288
GPU memory available: 2331492352


Then the total GPU memory is the same for each printed line.

index = 509
* Memory available before allocation.
Total GPU memory: 68251232
GPU memory available: 68251256
** Memory available after allocation.
Total GPU memory: 2818572288
GPU memory available: 2323103744, Consumed: 0
*** Memory available after free'ing.
Total GPU memory: 2818572288
GPU memory available: 2323103744

index = 510
* Memory available before allocation.
Total GPU memory: 68251232
GPU memory available: 68251256
** Memory available after allocation.
Total GPU memory: 2818572288
GPU memory available: 2323103744, Consumed: 0
*** Memory available after free'ing.
Total GPU memory: 2818572288
GPU memory available: 2323103744

index = 511
* Memory available before allocation.
Total GPU memory: 68251232
GPU memory available: 68251256
** Memory available after allocation.
Total GPU memory: 2818572288
GPU memory available: 2323103744, Consumed: 0
*** Memory available after free'ing.
Total GPU memory: 2818572288
GPU memory available: 2323103744

what i would like to know is, why is the total GPU memory different between the cudaMalloc calls and why is the consumed memory 0 after the first iteration of the loop?

FYI: im running a Tesla C2050 card with close to 3 GB memory.

Thanks in advance.
I'm getting different values for the total memory on calls to cudaMemGetInfo after allocating memory.

It should be be noted that i am running this via the matlab mex interface, perhaps this has something to do with it?



This code is executed inside a matlab for loop from 0 to 511



...

/* Check GPU memory before allocation. */

size_t freeMemBefore = 0;

size_t totalMem = 0;

size_t freeMemAfterAlloc = 0;

size_t freeMemAfterFree = 0;



mexPrintf("* Memory available before allocation.\n");

cudaMemGetInfo(&freeMemBefore, &totalMem);

mexPrintf("Total GPU memory: %lu\n",&totalMem);

mexPrintf("GPU memory available: %lu\n",&freeMemBefore);



/* Pointers for the device memory */

float *a;

double *b;

float *c, *d; // Complex



/* Allocate memory on the device */

cudaMalloc( (void **) &a, sizeof(float)*999);

cudaMalloc( (void **) &b, sizeof(double)*999);



cudaMalloc( (void **) &c, sizeof(double)*512);

cudaMalloc( (void **) &d, sizeof(double)*512);



mexPrintf("** Memory available after allocation.\n");

cudaMemGetInfo(&freeMemAfterAlloc, &totalMem);

mexPrintf("Total GPU memory: %lu\n",totalMem);

mexPrintf("GPU memory available: %lu, Consumed: %lu\n",freeMemAfterAlloc,(freeMemBefore - freeMemAfterAlloc));



... some cudaMemcpy's (cudaMemcpyHostToDevice) here ...



... launch kernel here ...



... some cudaMemcpy's (cudaMemcpyDeviceToHost) here ...



... cudaFree(a, b,c,d) here ...





mexPrintf("*** Memory available after free'ing.\n");

cudaMemGetInfo(&freeMemAfterFree, &totalMem);

mexPrintf("Total GPU memory: %lu\n",totalMem);

mexPrintf("GPU memory available: %lu\n\n",freeMemAfterFree);



return;






results:

index = 0

* Memory available before allocation.

Total GPU memory: 68245376

GPU memory available: 68245400

** Memory available after allocation.

Total GPU memory: 2818572288

GPU memory available: 2331492352, Consumed: 2097152

*** Memory available after free'ing.

Total GPU memory: 2818572288

GPU memory available: 2331492352



index = 1

* Memory available before allocation.

Total GPU memory: 68245376

GPU memory available: 68245400

** Memory available after allocation.

Total GPU memory: 2818572288

GPU memory available: 2331492352, Consumed: 0

*** Memory available after free'ing.

Total GPU memory: 2818572288

GPU memory available: 2331492352



index = 2

* Memory available before allocation.

Total GPU memory: 68251232

GPU memory available: 68251256

** Memory available after allocation.

Total GPU memory: 2818572288

GPU memory available: 2331492352, Consumed: 0

*** Memory available after free'ing.

Total GPU memory: 2818572288

GPU memory available: 2331492352





Then the total GPU memory is the same for each printed line.



index = 509

* Memory available before allocation.

Total GPU memory: 68251232

GPU memory available: 68251256

** Memory available after allocation.

Total GPU memory: 2818572288

GPU memory available: 2323103744, Consumed: 0

*** Memory available after free'ing.

Total GPU memory: 2818572288

GPU memory available: 2323103744



index = 510

* Memory available before allocation.

Total GPU memory: 68251232

GPU memory available: 68251256

** Memory available after allocation.

Total GPU memory: 2818572288

GPU memory available: 2323103744, Consumed: 0

*** Memory available after free'ing.

Total GPU memory: 2818572288

GPU memory available: 2323103744



index = 511

* Memory available before allocation.

Total GPU memory: 68251232

GPU memory available: 68251256

** Memory available after allocation.

Total GPU memory: 2818572288

GPU memory available: 2323103744, Consumed: 0

*** Memory available after free'ing.

Total GPU memory: 2818572288

GPU memory available: 2323103744



what i would like to know is, why is the total GPU memory different between the cudaMalloc calls and why is the consumed memory 0 after the first iteration of the loop?



FYI: im running a Tesla C2050 card with close to 3 GB memory.



Thanks in advance.

Physics is like sex,

Sure it has practical applications, but thats not why we do it.

- R. Feynman.

#1
Posted 04/26/2012 05:36 AM   
In the second and third mexprintf you should print the value of the variables not the address:

mexPrintf("Total GPU memory: %lu\n",totalMem);
mexPrintf("GPU memory available: %lu\n",freeMemBefore);
In the second and third mexprintf you should print the value of the variables not the address:



mexPrintf("Total GPU memory: %lu\n",totalMem);

mexPrintf("GPU memory available: %lu\n",freeMemBefore);

#2
Posted 04/26/2012 06:13 AM   
Scroll To Top