My question is based on a project I have partially done, but there is still something I'm not clear.
My goal is to create a R package contains GPU functions (some are from Nividia cuda library, some are my self-defined CUDA functions) My design is quite different from current R's GPU package, I want to create a R object (external pointer) point to GPU address, and run my GPU function direct on GPU side without transferring forth and back between CPU and GPU. I used the R external pointer to implement my design. But I found I have memory leak problems on GPU side, I can still fix it by running gc() function explicitly in R side, but I'm just wondering if I missed something in my C code. Would you please indicate my mistake, because this is my first time write a R package, and I could possibly made some terrible mistakes. actually, I have wrote bunch of GPU functions which can run on GPU side with the object created by following create function, but the memory leak kills me if I need to deal with some huge dataset. Here is my create function, I create a gpu pointer x, and allocate GPU memory for x, then make a R external pointer ext based on x, and copy the cpu vector input to my gpu external pointer ext, /* define function to create a vector in GPU by transferring a R's vector to GPU. input is R's vector and its length, output is a R external pointer pointing to GPU vector(device) */ SEXP createGPU(SEXP input, SEXP n) { int *lenth = INTEGER(n); PROTECT (input = AS_NUMERIC (input)); double * temp; temp = REAL(input); double *x; ##here is the step which causes the memory leak cudacall(cudaMalloc((void**)&x, *lenth * sizeof(double))); //protect the R external pointer from finalizer SEXP ext = PROTECT(R_MakeExternalPtr(x, R_NilValue, R_NilValue)); R_RegisterCFinalizerEx(ext, _finalizer, TRUE); //copying CPU to GPU cublascall(cublasSetVector(*lenth, sizeof(double), temp, 1, R_ExternalPtrAddr(ext), 1)); UNPROTECT(2); return ext; } here is my finalized for my create function, /* define finalizer for R external pointer input is R external pointer, function will finalize the pointer when it is not in use. */ static void _finalizer(SEXP ext) { if (!R_ExternalPtrAddr(ext)) return; double * ptr= (double *) R_ExternalPtrAddr(ext); Rprintf("finalizer invoked once \n"); cudacall(cudaFree(ptr)); R_ClearExternalPtr(ext); } My create function can run smoothly, but if I run the create function too many times, it shows out of memory for my GPU device, which clearly implies memory leak problem. Can anybody help? Help alot in advance! ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel