cupy.cuda.MemoryPool#

class cupy.cuda.MemoryPool(allocator=None)[源代码]#

主机上所有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(self, 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 内存量的一个分数。例如,如果你有一个具有 2 GiB 内存的 GPU,你可以使用 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。