提交 edd180ad authored 作者: Frederic's avatar Frederic

More debug print for device malloc/free.

上级 722ee497
...@@ -81,7 +81,7 @@ void * device_malloc(size_t size, int verbose) ...@@ -81,7 +81,7 @@ void * device_malloc(size_t size, int verbose)
cudaGetLastError(); cudaGetLastError();
fprintf(stderr, fprintf(stderr,
"Error when tring to find the memory information" "Error when tring to find the memory information"
" on the GPU\n"); " on the GPU: %s\n", cudaGetErrorString(err2));
} }
#if COMPUTE_GPU_MEM_USED #if COMPUTE_GPU_MEM_USED
fprintf(stderr, fprintf(stderr,
...@@ -98,7 +98,8 @@ void * device_malloc(size_t size, int verbose) ...@@ -98,7 +98,8 @@ void * device_malloc(size_t size, int verbose)
#endif #endif
} }
PyErr_Format(PyExc_MemoryError, PyErr_Format(PyExc_MemoryError,
"Error allocating %li bytes of device memory (%s).", (long)size, cudaGetErrorString(err)); "Error allocating %li bytes of device memory (%s).",
(long)size, cudaGetErrorString(err));
return NULL; return NULL;
} }
if (rval != NULL){ if (rval != NULL){
...@@ -109,14 +110,19 @@ void * device_malloc(size_t size, int verbose) ...@@ -109,14 +110,19 @@ void * device_malloc(size_t size, int verbose)
#if COMPUTE_GPU_MEM_USED #if COMPUTE_GPU_MEM_USED
_allocated_size += size; _allocated_size += size;
_max_allocated_size = std::max(_max_allocated_size, _allocated_size); _max_allocated_size = std::max(_max_allocated_size, _allocated_size);
int i = 0;
for(int i=0;i<TABLE_SIZE;i++){ for(;i<TABLE_SIZE;i++){
if(NULL==_alloc_size_table[i].ptr){ if(NULL==_alloc_size_table[i].ptr){
_alloc_size_table[i].ptr=rval; _alloc_size_table[i].ptr=rval;
_alloc_size_table[i].size=size; _alloc_size_table[i].size=size;
break; break;
} }
} }
if (i == TABLE_SIZE){
fprintf(stderr,
"When tracking GPU malloc, our table size wasn't big enough."
" So we loose some tracking. Raise the value of TABLE_SIZE in the file cuda_ndarra.cu");
}
#endif #endif
} }
//fprintf(stderr, //fprintf(stderr,
...@@ -129,7 +135,7 @@ void * device_malloc(size_t size, int verbose) ...@@ -129,7 +135,7 @@ void * device_malloc(size_t size, int verbose)
//printf("MEMSET\n"); //printf("MEMSET\n");
} }
#if PRINT_FREE_MALLOC #if PRINT_FREE_MALLOC
fprintf(stderr, "device malloc %p\n",rval); fprintf(stderr, "device malloc %p of size %d\n", rval, size);
#endif #endif
return rval; return rval;
} }
...@@ -137,7 +143,18 @@ void * device_malloc(size_t size, int verbose) ...@@ -137,7 +143,18 @@ void * device_malloc(size_t size, int verbose)
int device_free(void *ptr) int device_free(void *ptr)
{ {
#if PRINT_FREE_MALLOC #if PRINT_FREE_MALLOC
fprintf(stderr, "device_free %p\n",ptr); size_t free = 0, total = 0;
cudaError_t err2 = cudaMemGetInfo(&free, &total);
if (err2 != cudaSuccess){
cudaGetLastError();
fprintf(stderr,
"Error when tring to find the memory information"
" on the GPU: %s\n", cudaGetErrorString(err2));
}
fprintf(stderr, "device_free %p"
" Driver report %d bytes free and %d bytes total \n",
ptr, free, total);
#endif #endif
#if PRECHECK_ERROR #if PRECHECK_ERROR
cudaError_t prevError = cudaGetLastError(); cudaError_t prevError = cudaGetLastError();
...@@ -164,15 +181,32 @@ int device_free(void *ptr) ...@@ -164,15 +181,32 @@ int device_free(void *ptr)
// it returns something else I still don't see why we should ignore // it returns something else I still don't see why we should ignore
// it. All we want to do here is reset the flag. // it. All we want to do here is reset the flag.
cudaGetLastError(); cudaGetLastError();
size_t free = 0, total = 0;
cudaError_t err2 = cudaMemGetInfo(&free, &total);
if (err2 != cudaSuccess){
cudaGetLastError();
fprintf(stderr,
"Error when tring to find the memory information"
" on the GPU: %s\n", cudaGetErrorString(err2));
}
#if COMPUTE_GPU_MEM_USED #if COMPUTE_GPU_MEM_USED
int i = 0;
for(;i<TABLE_SIZE;i++)
if(_alloc_size_table[i].ptr==ptr){
break;
}
assert(i<TABLE_SIZE);
fprintf(stderr, fprintf(stderr,
"Error freeing device pointer %p (%s).%d byte already allocated\n", "Error freeing device pointer %p (%s) of size %d. %d byte already allocated."
ptr, cudaGetErrorString(err), _allocated_size); " Driver report %d bytes free and %d bytes total \n",
ptr, cudaGetErrorString(err),
_alloc_size_table[i].size, _allocated_size, free, total);
#else #else
fprintf(stderr, fprintf(stderr,
"Error freeing device pointer %p (%s).\n", "Error freeing device pointer %p (%s)."
" Driver report %d bytes free and %d bytes total \n",
ptr, ptr,
cudaGetErrorString(err)); cudaGetErrorString(err), free, total);
#endif #endif
PyErr_Format(PyExc_MemoryError, PyErr_Format(PyExc_MemoryError,
"error freeing device pointer %p (%s)", "error freeing device pointer %p (%s)",
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论