cupy.cuda.MemoryPool#
- class cupy.cuda.MemoryPool(allocator=None)[source]#
主机上所有 GPU 设备的内存池。
内存池会保留所有分配的内存,即使它们已被用户释放。释放的内存缓冲区作为空闲块被内存池持有,并用于后续相同大小的内存分配。分配的块针对每个设备进行管理,因此该类的一个实例可用于多个设备。
注意
当通过重用预先分配的块跳过分配时,它不会调用
cudaMalloc
,因此不会发生 CPU-GPU 同步。这使得内存分配和核函数调用的交错非常快速。注意
内存池会尽可能保留分配的块而不释放。这会导致程序占用大部分设备内存,从而可能导致并行运行的其他 CUDA 程序出现内存不足的情况。
- 参数:
allocator (function) – 基本的 CuPy 内存分配器。当所需大小的块全部在使用时,它用于分配新的块。
方法
- free_all_blocks(self, stream=None)#
释放空闲块。
- 参数:
stream (cupy.cuda.Stream) – 释放给定流的区域中的空闲块。默认释放所有区域中的块。
注意
内存池可能会为了空间效率而分割空闲块。一个分割后的块直到其所有部分重新合并回一个块后才会释放,即使调用了
free_all_blocks()
方法也是如此。
- free_all_free(self)#
(已弃用) 请改用
free_all_blocks()
。
- malloc(size_t size) MemoryPointer #
分配内存,如果可能则从内存池分配。
此方法可用作 CuPy 内存分配器。将内存池用作默认分配器最简单的方法如下所示:
set_allocator(MemoryPool().malloc)
此外,将托管内存(统一内存)的内存池用作默认分配器的方法如下所示:
set_allocator(MemoryPool(malloc_managed).malloc)
- 参数:
size (int) – 要分配的内存缓冲区大小(字节)。
- 返回:
指向已分配缓冲区的指针。
- 返回类型:
- set_limit(self, size=None, fraction=None)#
设置当前设备的内存分配上限。
指定 fraction 时,其值将成为可分配 GPU 内存总量的比例。例如,如果您的 GPU 有 2 GiB 内存,您可以使用
set_limit(fraction=0.5)
或set_limit(size=1024**3)
将内存大小限制为 1 GiB。size
和fraction
不能同时指定。如果两者都未指定或指定为0
,则限制将被禁用。注意
您还可以通过使用
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。