cupy.cuda.MemoryHook#
- class cupy.cuda.MemoryHook[源代码]#
用于内存分配的钩子基类。
MemoryHook是一个回调对象。注册的内存钩子在从GPU设备分配内存之前和之后,以及从内存池检索内存和将内存释放到内存池时被调用。派生自
MemoryHook的内存钩子需要实现六个方法:alloc_preprocess()、alloc_postprocess()、malloc_preprocess()、malloc_postprocess()、free_preprocess()和free_postprocess()。默认情况下,这些方法不执行任何操作。具体来说,在从GPU设备分配内存之前(相应地,之后),会调用所有注册的内存钩子的
alloc_preprocess()方法(相应地,alloc_postprocess()方法)。同样地,所有注册的内存钩子中的
malloc_postprocess())在从内存池获取内存之前(分别地,之后)被调用。下面是一个伪代码,用于描述 malloc 和钩子如何工作。请注意,如果在缓存的空闲块中找到,则不会调用
alloc_preprocess()和alloc_postprocess():def malloc(size): Call malloc_preprocess of all memory hooks Try to find a cached free chunk from memory pool if chunk is not found: Call alloc_preprocess for all memory hooks Invoke actual memory allocation to get a new chunk Call alloc_postprocess for all memory hooks Call malloc_postprocess for all memory hooks
此外,所有注册的内存钩子中的
free_postprocess())在内存释放到内存池之前(分别对应之后)被调用。下面是一个伪代码,用于描述自由和钩子如何工作:
def free(ptr): Call free_preprocess of all memory hooks Push a memory chunk of a given pointer back to memory pool Call free_postprocess for all memory hooks
要注册一个内存钩子,请使用
with语句。内存钩子会在with语句内的所有方法调用中注册,并在with语句结束时注销。备注
CuPy 将已注册的函数钩子字典存储为线程本地对象。因此,注册的内存钩子可能会因线程而异。
方法
- __enter__(self)#
- __exit__(self, *_)#
- alloc_postprocess(self, **kwargs)#
从GPU设备分配内存后调用的回调函数。
- alloc_preprocess(self, **kwargs)#
从GPU设备分配内存之前调用的回调函数。
- free_postprocess(self, **kwargs)#
回调函数在将内存释放回内存池后调用。
- free_preprocess(self, **kwargs)#
在将内存释放回内存池之前调用的回调函数。
- malloc_postprocess(self, **kwargs)#
从内存池中检索内存后调用的回调函数。
- malloc_preprocess(self, **kwargs)#
从内存池中检索内存之前调用的回调函数。
- __eq__(value, /)#
返回 self==value。
- __ne__(value, /)#
返回 self!=value。
- __lt__(value, /)#
返回 self<value。
- __le__(value, /)#
返回 self<=value。
- __gt__(value, /)#
返回 self>value。
- __ge__(value, /)#
返回 self>=value。
属性
- name = 'MemoryHook'#