cupy.cuda.MemoryAsyncPool#
- class cupy.cuda.MemoryAsyncPool(pool_handles='current')[来源]#
(实验性)主机上所有 GPU 设备共用的 CUDA 内存池。
内存池会保留所有分配的内存,即使它们已被用户释放。此类的实例可用于多个设备。此类使用 CUDA 的流有序内存分配器(CUDA 11.2+ 支持)。将此内存池用作 CuPy 默认分配器的最简单方法如下:
set_allocator(MemoryAsyncPool().malloc)
使用此功能需要 CUDA 版本 >= 11.2,以及受支持的 GPU 和平台。如果不支持,将引发错误。
当前的 CuPy 流用于分配/释放内存。
- 参数:
pool_handles (str 或 int) – 指示使用哪个内存池的标志。‘default’ 表示设备的默认内存池,‘current’ 表示当前内存池(可能是默认内存池),int 表示从其他地方创建的
cudaMemPool_t
,用于外部内存池。也可以接受包含这些标志的列表,此时列表的长度必须等于可见设备的总数,以便独立设置每个设备的内存池。
警告
此功能目前处于实验阶段,未来可能会有所改变。
注意
MemoryAsyncPool
目前无法与内存钩子(memory hooks)一起使用。另请参阅
方法
- free_all_blocks(self, stream=None)#
释放空闲内存。
- 参数:
stream (cupy.cuda.Stream) – 释放给定
stream
上释放的内存。如果stream
为None
,则使用当前流。
另请参阅
- get_limit(self) size_t #
获取当前设备的内存分配上限。
- 返回:
字节数
- 返回类型:
注意
与
MemoryPool
不同,MemoryAsyncPool
的set_limit()
方法只能设置一个软限制。如果其他(非 CuPy)应用程序也从同一个内存池分配内存,则此限制可能不会被遵守。
- malloc(size_t size) MemoryPointer #
在当前流上从当前设备的内存池分配内存。
此方法可用作 CuPy 内存分配器。将内存池用作默认分配器的最简单方法如下:
set_allocator(MemoryAsyncPool().malloc)
- 参数:
size (int) – 要分配的内存缓冲区的大小(以字节为单位)。
- 返回:
指向已分配缓冲区的指针。
- 返回类型:
- n_free_blocks(self) size_t #
- set_limit(self, size=None, fraction=None)#
设置当前设备的内存分配上限。
当指定 fraction 时,其值将成为 GPU 可用内存量的分数。例如,如果您有一个具有 2 GiB 内存的 GPU,可以使用
set_limit(fraction=0.5)
或set_limit(size=1024**3)
将内存大小限制为 1 GiB。不能同时指定
size
和fraction
。如果两者都未指定或指定为0
,则会禁用限制。注意
与
MemoryPool
不同,MemoryAsyncPool
的set_limit()
方法只能设置一个软限制。如果其他(非 CuPy)应用程序也从同一个内存池分配内存,则此限制可能不会被遵守。在内部,此限制是通过cudaMemPoolAttrReleaseThreshold
属性设置的。注意
您还可以使用
CUPY_GPU_MEMORY_LIMIT
环境变量来设置限制,详见 环境变量。此方法设置的限制会覆盖环境变量中指定的值。另请注意,此方法仅更改当前设备的限制,而环境变量设置所有设备的默认限制。
- __eq__(value, /)#
返回 self==value。
- __ne__(value, /)#
返回 self!=value。
- __lt__(value, /)#
返回 self<value。
- __le__(value, /)#
返回 self<=value。
- __gt__(value, /)#
返回 self>value。
- __ge__(value, /)#
返回 self>=value。
属性
- memoryAsyncHasStat#