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()

free_bytes(self) size_t#

获取池已获取但未使用的总字节数。

返回

池已获取但未使用的总字节数。

返回类型

int

get_limit(self) size_t#

获取当前设备的内存分配上限。

返回

字节数

返回类型

int

malloc(size_t size) MemoryPointer#

分配内存,如果可能则从内存池分配。

此方法可用作 CuPy 内存分配器。将内存池用作默认分配器最简单的方法如下所示:

set_allocator(MemoryPool().malloc)

此外,将托管内存(统一内存)的内存池用作默认分配器的方法如下所示:

set_allocator(MemoryPool(malloc_managed).malloc)
参数

size (int) – 要分配的内存缓冲区大小(字节)。

返回

指向已分配缓冲区的指针。

返回类型

MemoryPointer

n_free_blocks(self) size_t#

统计空闲块的总数。

返回

空闲块的总数。

返回类型

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。

sizefraction 不能同时指定。如果两者都指定或指定为 0,则限制将被禁用。

注意

您还可以通过使用 CUPY_GPU_MEMORY_LIMIT 环境变量来设置限制,详细信息请参阅环境变量。通过此方法设置的限制会覆盖环境变量中指定的值。

另请注意,此方法仅更改当前设备的限制,而环境变量为所有设备设置默认限制。

参数
  • size (int) – 限制大小(字节)。

  • fraction (float) – 范围在 [0, 1] 内的比例。

total_bytes(self) size_t#

获取池已获取的总字节数。

返回

池已获取的总字节数。

返回类型

int

used_bytes(self) size_t#

获取池已使用的总字节数。

返回

池已使用的总字节数。

返回类型

int

__eq__(value, /)#

返回 self==value。

__ne__(value, /)#

返回 self!=value。

__lt__(value, /)#

返回 self<value。

__le__(value, /)#

返回 self<=value。

__gt__(value, /)#

返回 self>value。

__ge__(value, /)#

返回 self>=value。