cupy.cuda.MemoryHook#
- class cupy.cuda.MemoryHook[source]#
内存分配钩子的基类。
MemoryHook
是一个回调对象。注册的内存钩子在从 GPU 设备分配内存之前和之后、从内存池检索内存之后、以及将内存释放回内存池时被调用。派生自
MemoryHook
的内存钩子需要实现六个方法:alloc_preprocess()
、alloc_postprocess()
、malloc_preprocess()
、malloc_postprocess()
、free_preprocess()
和free_postprocess()
。默认情况下,这些方法不执行任何操作。具体来说,所有注册的内存钩子的
alloc_preprocess()
(或alloc_postprocess()
) 在从 GPU 设备分配内存之前 (或之后) 被调用。同样,所有注册的内存钩子的
malloc_preprocess()
(或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_preprocess()
(或free_postprocess()
) 在内存被释放回内存池之前 (或之后) 被调用。下面是一个伪代码,描述了 free 和钩子的工作原理
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'#