00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00021 #include <stdio.h>
00022 #include <stdlib.h>
00023 #include <string.h>
00024 #include <cuda.h>
00025 #include "utilities.h"
00026 #include "CUDAKernels.h"
00027
00028 #define CUERR { cudaError_t err; \
00029 if ((err = cudaGetLastError()) != cudaSuccess) { \
00030 printf("CUDA error: %s, %s line %d\n", cudaGetErrorString(err), __FILE__, __LINE__); \
00031 return NULL; }}
00032
00033
00034
00035 __constant__ static float constbuf[16384];
00036
00037
00038 #define MAXLOOPS 16
00039
00040 void * vmd_cuda_devpool_clear_device_mem(void * voidparms) {
00041 int id, count, dev;
00042 char *bufs[MAXLOOPS];
00043 size_t bufszs[MAXLOOPS];
00044 float zerobuf[16 * 1024];
00045 memset(zerobuf, 0, sizeof(zerobuf));
00046 memset(bufs, 0, MAXLOOPS * sizeof(sizeof(char *)));
00047 memset(bufszs, 0, MAXLOOPS * sizeof(sizeof(size_t)));
00048
00049 wkf_threadpool_worker_getid(voidparms, &id, &count);
00050 wkf_threadpool_worker_getdevid(voidparms, &dev);
00051
00052
00053 cudaMemcpyToSymbol(constbuf, zerobuf, sizeof(zerobuf), 0);
00054 CUERR
00055
00056 #if 0
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 #if !defined(VMDMPI)
00079 int verbose=0;
00080 if (getenv("VMDCUDAVERBOSE") != NULL)
00081 verbose=1;
00082
00083 size_t sz(1024 * 1024 * 1024);
00084 int i, bufcnt=0;
00085 size_t totalsz=0;
00086 for (i=0; i<MAXLOOPS; i++) {
00087
00088
00089
00090 cudaError_t rc;
00091 while ((sz > (16 * 1024 * 1024)) &&
00092 ((rc=cudaMalloc((void **) &bufs[i], sz)) != cudaSuccess)) {
00093 cudaGetLastError();
00094 sz >>= 1;
00095 }
00096
00097 if (rc == cudaSuccess) {
00098 bufszs[i] = sz;
00099 totalsz += sz;
00100 bufcnt++;
00101 if (verbose)
00102 printf("devpool thread[%d / %d], dev %d buf[%d] size: %d\n", id, count, dev, i, sz);
00103 } else {
00104 bufs[i] = NULL;
00105 bufszs[i] = 0;
00106 if (verbose)
00107 printf("devpool thread[%d / %d], dev %d buf[%d] failed min allocation size: %d\n", id, count, dev, i, sz);
00108
00109
00110 break;
00111 }
00112 }
00113
00114 if (verbose)
00115 printf("devpool thread[%d / %d], dev %d allocated %d buffers\n", id, count, dev, bufcnt);
00116
00117 for (i=0; i<bufcnt; i++) {
00118 if ((bufs[i] != NULL) && (bufszs[i] > 0)) {
00119 cudaMemset(bufs[i], 0, bufszs[i]);
00120 cudaFree(bufs[i]);
00121 bufs[i] = NULL;
00122 bufszs[i] = 0;
00123 }
00124 }
00125 CUERR
00126
00127 if (verbose)
00128 printf(" Device %d cleared %d MB of GPU memory\n", dev, totalsz / (1024 * 1024));
00129
00130 #endif
00131 #endif
00132
00133 return NULL;
00134 }
00135