内存管理
CUDA 内置目标弃用通知
Numba 内置的 CUDA 目标已弃用,后续开发已移至 NVIDIA numba-cuda 软件包。请参阅 内置 CUDA 目标弃用和维护状态。
- numba.cuda.to_device(obj, stream=0, copy=True, to=None)
在设备上分配并传输 NumPy ndarray 或结构化标量。
将 NumPy 数组从主机复制到设备
ary = np.arange(10) d_ary = cuda.to_device(ary)
将传输任务加入流队列
stream = cuda.stream() d_ary = cuda.to_device(ary, stream=stream)
生成的
d_ary
是一个DeviceNDArray
。将设备数据复制到主机
hary = d_ary.copy_to_host()
将设备数据复制到现有数组到主机
ary = np.empty(shape=d_ary.shape, dtype=d_ary.dtype) d_ary.copy_to_host(ary)
将传输任务加入流队列
hary = d_ary.copy_to_host(stream=stream)
- numba.cuda.device_array(shape, dtype=np.float64, strides=None, order='C', stream=0)
分配一个空的设备 ndarray。类似于
numpy.empty()
。
- numba.cuda.device_array_like(ary, stream=0)
使用数组信息调用
device_array()
。
- numba.cuda.pinned_array(shape, dtype=np.float64, strides=None, order='C')
分配一个带有固定(页锁定)缓冲区的
ndarray
。类似于np.empty()
。
- numba.cuda.pinned_array_like(ary)
使用数组信息调用
pinned_array()
。
- numba.cuda.mapped_array(shape, dtype=np.float64, strides=None, order='C', stream=0, portable=False, wc=False)
分配一个映射的 ndarray,其缓冲区固定并映射到设备。类似于 np.empty()
- 参数
portable – 一个布尔标志,用于允许分配的设备内存可在多个设备中使用。
wc – 一个布尔标志,用于启用写入合并分配,这种分配方式主机写入和设备读取更快,但主机写入和设备写入则较慢。
- numba.cuda.mapped_array_like(ary, stream=0, portable=False, wc=False)
使用数组信息调用
mapped_array()
。
- numba.cuda.managed_array(shape, dtype=np.float64, strides=None, order='C', stream=0, attach_global=True)
分配一个带托管缓冲区的 np.ndarray。类似于 np.empty()。
托管内存支持 Linux / x86 和 PowerPC,在 Windows 和 Linux / AArch64 上被认为是实验性的。
- 参数
attach_global – 一个标志,指示是否全局附加。全局附加意味着内存可从任何设备上的任何流访问。如果为
False
,则附加为 主机,内存仅可由计算能力 6.0 及更高版本的设备访问。
- numba.cuda.pinned(*arylist)
一个上下文管理器,用于临时固定一系列主机 ndarray。
- numba.cuda.mapped(*arylist, **kws)
一个上下文管理器,用于临时映射一系列主机 ndarray。
设备对象
- class numba.cuda.cudadrv.devicearray.DeviceNDArray(shape, strides, dtype, stream=0, gpu_data=None)
一种 GPU 上的数组类型
- copy_to_device(ary, stream=0)
将 ary 复制到 self。
如果 ary 是 CUDA 内存,则执行设备到设备的传输。否则,执行主机到设备的传输。
- copy_to_host(ary=None, stream=0)
将
self
复制到ary
,如果ary
为None
则创建一个新的 Numpy ndarray。如果给定了 CUDA
stream
,则传输将作为给定流的一部分异步进行。否则,传输是同步的:函数在复制完成后返回。始终返回主机数组。
示例
import numpy as np from numba import cuda arr = np.arange(1000) d_arr = cuda.to_device(arr) my_kernel[100, 100](d_arr) result_array = d_arr.copy_to_host()
- is_c_contiguous()
如果数组是 C 连续的,则返回 true。
- is_f_contiguous()
如果数组是 Fortran 连续的,则返回 true。
- ravel(order='C', stream=0)
展平一个连续数组而不改变其内容,类似于
numpy.ndarray.ravel()
。如果数组不连续,则引发异常。
- reshape(*newshape, **kws)
重塑数组而不改变其内容,类似于
numpy.ndarray.reshape()
。示例d_arr = d_arr.reshape(20, 50, order='F')
- split(section, stream=0)
将数组分割成大小为 section 的等份。如果数组不能等分,则最后一份会较小。
- class numba.cuda.cudadrv.devicearray.DeviceRecord(dtype, stream=0, gpu_data=None)
一种 GPU 上的记录类型
- copy_to_device(ary, stream=0)
将 ary 复制到 self。
如果 ary 是 CUDA 内存,则执行设备到设备的传输。否则,执行主机到设备的传输。
- copy_to_host(ary=None, stream=0)
将
self
复制到ary
,如果ary
为None
则创建一个新的 Numpy ndarray。如果给定了 CUDA
stream
,则传输将作为给定流的一部分异步进行。否则,传输是同步的:函数在复制完成后返回。始终返回主机数组。
示例
import numpy as np from numba import cuda arr = np.arange(1000) d_arr = cuda.to_device(arr) my_kernel[100, 100](d_arr) result_array = d_arr.copy_to_host()
- class numba.cuda.cudadrv.devicearray.MappedNDArray(shape, strides, dtype, stream=0, gpu_data=None)
使用 CUDA 映射内存的主机数组。
- copy_to_device(ary, stream=0)
将 ary 复制到 self。
如果 ary 是 CUDA 内存,则执行设备到设备的传输。否则,执行主机到设备的传输。
- copy_to_host(ary=None, stream=0)
将
self
复制到ary
,如果ary
为None
则创建一个新的 Numpy ndarray。如果给定了 CUDA
stream
,则传输将作为给定流的一部分异步进行。否则,传输是同步的:函数在复制完成后返回。始终返回主机数组。
示例
import numpy as np from numba import cuda arr = np.arange(1000) d_arr = cuda.to_device(arr) my_kernel[100, 100](d_arr) result_array = d_arr.copy_to_host()
- split(section, stream=0)
将数组分割成大小为 section 的等份。如果数组不能等分,则最后一份会较小。