I ran into this problem a while ago. As Andrea pointed out it's due to a reference loop somewhere in PyCUDA.
The only way to free the memory in between kernel calls without directly calling free() on the device allocation objects is with the python gc module. import gc # between calls gc.collect() Tony On Wed, Oct 12, 2011 at 5:53 PM, Matthew Graham <m...@cacr.caltech.edu>wrote: > Hi Andreas, > > Unfortunately that does not seem to work. > > Cheers, > > Matthew > > On Oct 11, 2011, at 6:27 PM, Andreas Kloeckner wrote: > > > On Tue, 11 Oct 2011 17:41:56 -0700, Matthew Graham <m...@cacr.caltech.edu> > wrote: > >> Hi, > >> > >> I'm making successive calls to a function with each call requiring an > initialization and a release of the CUDA context. However, memory on the > device is not getting freed between calls. What I have in a call is: > >> > >> driver.init() > >> dev = driver.Device(num) > >> context = dev.make_context() > >> print driver.mem_get_info() > >> mod = compiler.SourceModule(code) > >> ... # application logic here > >> context.pop() > >> > >> and this is showing: > >> > >> Obj 1 > >> (195731456, 265945088) > >> (182132736, 265945088) > >> (168099840, 265945088) > >> (154075136, 265945088) > >> Obj 2 > >> (140050432, 265945088) > >> (126025728, 265945088) > >> (112001024, 265945088) > >> (98009088, 265945088) > >> Obj 3 > >> (83984384, 265945088) > >> Obj 4 > >> (69959680, 265945088) > >> (55934976, 265945088) > >> (41517056, 265945088) > >> (26443776, 265945088) > >> Obj 5 > >> [11/Oct/2011:16:23:57] HTTP Traceback (most recent call last): > >> File > "/Library/Frameworks/Python.framework/Versions/6.0.0/lib/python2.6/site-packages/cherrypy/_cprequest.py", > line 606, in respond > >> cherrypy.response.body = self.handler() > >> File > "/Library/Frameworks/Python.framework/Versions/6.0.0/lib/python2.6/site-packages/cherrypy/_cpdispatch.py", > line 25, in __call__ > >> return self.callable(*self.args, **self.kwargs) > >> File "/Users/mjg/Projects/python/kiss/culsp.py", line 203, in culsp > >> context = dev.make_context() > >> MemoryError: cuCtxCreate failed: out of memory > >> > >> I've tried to put in del calls for the gpuarrays used after popping the > context (as per the 2DFFT and MultipleThreads example codes) but this is not > doing anything. How can I release the memory on the device between calls? > > > > Try pycuda.tools.clear_context_caches(). > > > > Andreas > > > _______________________________________________ > PyCUDA mailing list > PyCUDA@tiker.net > http://lists.tiker.net/listinfo/pycuda >
_______________________________________________ PyCUDA mailing list PyCUDA@tiker.net http://lists.tiker.net/listinfo/pycuda