cupy.cuda.MemoryAsyncPool#
- class cupy.cuda.MemoryAsyncPool(pool_handles='current')[源代码]#
(实验性)主机上所有GPU设备的CUDA内存池。
内存池保留任何分配,即使它们被用户释放。此类的一个实例可以用于多个设备。此类使用 CUDA 的流有序内存分配器(支持 CUDA 11.2+)。使用此池作为 CuPy 默认分配器的最简单方法是以下代码:
set_allocator(MemoryAsyncPool().malloc)
使用此功能需要支持的 GPU 和平台上的 CUDA >= 11.2。如果不支持,将引发错误。
当前的 CuPy 流用于分配/释放内存。
- 参数:
pool_handles (str or int) – 一个标志,用于指示使用哪个内存池。’default’ 表示设备的默认内存池,’current’ 表示当前内存池(可能是默认内存池),以及一个表示从其他地方创建的外部内存池的
cudaMemPool_t的 int。也可以接受由这些标志组成的列表,在这种情况下,列表长度必须等于可见设备的总数,以便可以独立设置每个设备的内存池。
警告
此功能目前处于实验阶段,可能会发生变化。
备注
MemoryAsyncPool目前不能与内存钩子一起工作。参见
方法
- free_all_blocks(self, stream=None)#
释放内存。
- 参数:
stream (cupy.cuda.Stream) – 释放给定
stream上已释放的内存。如果stream是None,则使用当前流。
参见
- get_limit(self) size_t#
获取当前设备的内存分配上限。
- 返回:
字节数
- 返回类型:
备注
与
MemoryPool不同,MemoryAsyncPool的set_limit()方法只能施加一个 软 限制。如果其他(非 CuPy)应用程序也从同一个内存池中分配内存,则此限制可能不会被遵守。
- malloc(self, 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#