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