From i2222222 at hotmail.com  Sat May 14 17:43:48 2016
From: i2222222 at hotmail.com (Yuan Li)
Date: Sat, 14 May 2016 23:43:48 +0800
Subject: [Rd] R external pointer and GPU memory leak problem
Message-ID: <BLU180-W21DEF2A64D3C1B436DD34D94750@phx.gbl>

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!? 		 	   		  


[Rd] R external pointer and GPU memory leak problem
Yuan Li