# 4.1。 CUDA 主机 API
> 原文: [http://numba.pydata.org/numba-doc/latest/cuda-reference/host.html](http://numba.pydata.org/numba-doc/latest/cuda-reference/host.html)
## 4.1.1。设备管理
### 4.1.1.1。设备检测和查询
以下功能可用于查询可用硬件:
```py
numba.cuda.is_available()
```
返回一个布尔值以指示 CUDA GPU 的可用性。
如果尚未初始化,则会初始化驱动程序。
```py
numba.cuda.detect()
```
检测支持的 CUDA 硬件并打印检测到的硬件的摘要。
返回一个布尔值,指示是否检测到任何支持的设备。
### 4.1.1.2。上下文管理
CUDA Python 函数在 CUDA 上下文中执行。系统中的每个 CUDA 设备都有一个相关的 CUDA 上下文,Numba 目前每个线程只允许一个上下文。有关 CUDA 上下文的更多详细信息,请参阅上下文管理上的 [CUDA 驱动程序 API 文档和](http://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__CTX.html) [CUDA C 编程指南上下文文档](http://docs.nvidia.com/cuda/cuda-c-programming-guide/#context)。 CUDA 上下文是 [`Context`](#numba.cuda.cudadrv.driver.Context "numba.cuda.cudadrv.driver.Context") 类的实例:
```py
class numba.cuda.cudadrv.driver.Context(device, handle)
```
此对象包装 CUDA Context 资源。
上下文不应由用户代码直接构造。
```py
get_memory_info()
```
在上下文中以字节为单位返回(空闲,总计)内存。
```py
pop()
```
从当前 CPU 线程弹出此上下文。请注意,此上下文必须位于上下文堆栈的顶部,否则将发生错误。
```py
push()
```
在当前 CPU 线程上推送此上下文。
```py
reset()
```
在此上下文中清理所有拥有的资源。
以下函数可用于获取或选择上下文:
```py
numba.cuda.current_context(devnum=0)
```
获取当前设备或按设备编号使用设备,并返回 CUDA 上下文。
```py
numba.cuda.require_context(fn)
```
执行 _fn_ 时,确保 CUDA 上下文可用的装饰器。
装饰 _fn_ 相当于写作:
```py
get_context()
fn()
```
在每个呼叫站点。
以下函数会影响当前上下文:
```py
numba.cuda.synchronize()
```
同步当前上下文。
```py
numba.cuda.close()
```
显式清除当前线程中的所有上下文,如果当前线程是主线程,则销毁所有上下文。
### 4.1.1.3。设备管理
Numba 维护了支持 CUDA 的设备列表:
```py
numba.cuda.gpus
```
支持的 CUDA 设备的可索引列表。此列表由整数设备 ID 索引。
或者,可以获得当前设备:
```py
numba.cuda.gpus.current()
```
返回当前选定的设备。
通过 [`numba.cuda.gpus`](#numba.cuda.gpus "numba.cuda.gpus") 获取设备始终提供 [`numba.cuda.cudadrv.devices._DeviceContextManager`](#numba.cuda.cudadrv.devices._DeviceContextManager "numba.cuda.cudadrv.devices._DeviceContextManager") 的实例,它充当所选设备的上下文管理器:
```py
class numba.cuda.cudadrv.devices._DeviceContextManager(device)
```
提供上下文管理器,用于在所选设备的上下文中执行。这种类型的实例的正常使用来自`numba.cuda.gpus`。例如,要在设备 2 上执行:
```py
with numba.cuda.gpus[2]:
d_a = numba.cuda.to_device(a)
```
将数组 _ 和 _ 复制到设备 2 上,由 _d_a_ 引用。
也可以使用以下三个功能选择上下文和设备或获取当前设备:
```py
numba.cuda.select_device(device_id)
```
使与设备 _device_id_ 关联的上下文成为当前上下文。
返回 Device 实例。
出错时引发异常。
```py
numba.cuda.get_current_device()
```
获取与当前线程关联的当前设备
```py
numba.cuda.list_devices()
```
返回所有检测到的设备的列表
[`numba.cuda.cudadrv.driver.Device`](#numba.cuda.cudadrv.driver.Device "numba.cuda.cudadrv.driver.Device") 类可用于查询所选设备的功能:
```py
class numba.cuda.cudadrv.driver.Device
```
与特定上下文关联的设备。
```py
compute_capability
```
元组 _(主要,次要)_ 表示支持的计算能力。
```py
id
```
设备的整数 ID。
```py
name
```
设备名称(例如“GeForce GTX 970”)
```py
reset()
```
删除设备的上下文。这将破坏在上下文中创建的所有内存分配,事件和流。
## 4.1.2。测量
### 4.1.2.1。分析
NVidia Visual Profiler 可以直接用于执行 CUDA Python 代码 - 不需要将对这些函数的调用插入到用户代码中。但是,这些功能可用于允许在代码的特定部分上有选择地执行分析。有关分析的更多信息,请参阅 [NVidia Profiler 用户指南](docs.nvidia.com/cuda/profiler-users-guide/)。
```py
numba.cuda.profile_start()
```
在当前上下文中启用配置文件集合。
```py
numba.cuda.profile_stop()
```
在当前上下文中禁用概要文件集合。
```py
numba.cuda.profiling()
```
上下文管理器,可以在进入时进行分析并在退出时禁用分析。
### 4.1.2.2。事件
事件可用于监视执行进度并记录到达的特定点的时间戳。事件创建立即返回,可以查询创建的事件以确定是否已到达。有关详细信息,请参阅 [CUDA C 编程指南事件部分](http://docs.nvidia.com/cuda/cuda-c-programming-guide/#events)。
以下函数用于创建和测量事件之间的时间:
```py
numba.cuda.event(timing=True)
```
创建 CUDA 事件。如果使用`timing=True`创建定时数据,则仅由事件记录定时数据。
```py
numba.cuda.event_elapsed_time(evtstart, evtend)
```
计算两个事件之间的经过时间(以毫秒为单位)。
事件是 [`numba.cuda.cudadrv.driver.Event`](#numba.cuda.cudadrv.driver.Event "numba.cuda.cudadrv.driver.Event") 类的实例:
```py
class numba.cuda.cudadrv.driver.Event(context, handle, finalizer=None)
```
```py
query()
```
如果最近记录之前的所有工作都已完成,则返回 True;否则,返回 False。
```py
record(stream=0)
```
将事件的记录点设置为给定流中的当前点。
当调用`record()`时在流中排队的所有工作都已完成时,将认为该事件已发生。
```py
synchronize()
```
同步主机线程以完成事件。
```py
wait(stream=0)
```
提交给流的所有未来工作将等到事件完成。
## 4.1.3。流管理
Streams 允许在给定上下文中的单个设备上执行并发。同一流中的排队工作项按顺序执行,但不同流中的工作项可以同时执行。涉及 CUDA 设备的大多数操作可以使用流异步执行,包括数据传输和内核执行。有关流的更多详细信息,请参见 [CUDA C 编程指南流](http://docs.nvidia.com/cuda/cuda-c-programming-guide/#streams)。
要创建流:
```py
numba.cuda.stream()
```
创建表示设备命令队列的 CUDA 流。
流是 [`numba.cuda.cudadrv.driver.Stream`](#numba.cuda.cudadrv.driver.Stream "numba.cuda.cudadrv.driver.Stream") 的实例:
```py
class numba.cuda.cudadrv.driver.Stream(context, handle, finalizer)
```
```py
auto_synchronize()
```
一个上下文管理器,它等待此流中的所有命令执行并在退出上下文时提交任何挂起的内存传输。
```py
synchronize()
```
等待此流中的所有命令执行。这将提交任何挂起的内存传输。
- 1. 用户手册
- 1.1。 Numba 的约 5 分钟指南
- 1.2。概述
- 1.3。安装
- 1.4。使用@jit 编译 Python 代码
- 1.5。使用@generated_jit 进行灵活的专业化
- 1.6。创建 Numpy 通用函数
- 1.7。用@jitclass 编译 python 类
- 1.8。使用@cfunc 创建 C 回调
- 1.9。提前编译代码
- 1.10。使用@jit 自动并行化
- 1.11。使用@stencil装饰器
- 1.12。从 JIT 代码 中回调到 Python 解释器
- 1.13。性能提示
- 1.14。线程层
- 1.15。故障排除和提示
- 1.16。常见问题
- 1.17。示例
- 1.18。会谈和教程
- 2. 参考手册
- 2.1。类型和签名
- 2.2。即时编译
- 2.3。提前编译
- 2.4。公用事业
- 2.5。环境变量
- 2.6。支持的 Python 功能
- 2.7。支持的 NumPy 功能
- 2.8。与 Python 语义的偏差
- 2.9。浮点陷阱
- 2.10。 Python 2.7 寿命终止计划
- 3. 用于 CUDA GPU 的 Numba
- 3.1。概述
- 3.2。编写 CUDA 内核
- 3.3。内存管理
- 3.4。编写设备功能
- 3.5。 CUDA Python 中支持的 Python 功能
- 3.6。支持的原子操作
- 3.7。随机数生成
- 3.8。设备管理
- 3.10。示例
- 3.11。使用 CUDA 模拟器 调试 CUDA Python
- 3.12。 GPU 减少
- 3.13。 CUDA Ufuncs 和广义 Ufuncs
- 3.14。共享 CUDA 内存
- 3.15。 CUDA 阵列接口
- 3.16。 CUDA 常见问题
- 4. CUDA Python 参考
- 4.1。 CUDA 主机 API
- 4.2。 CUDA 内核 API
- 4.3。内存管理
- 5. 用于 AMD ROC GPU 的 Numba
- 5.1。概述
- 5.2。编写 HSA 内核
- 5.3。内存管理
- 5.4。编写设备功能
- 5.5。支持的原子操作
- 5.6。代理商
- 5.7。 ROC Ufuncs 和广义 Ufuncs
- 5.8。示例
- 6. 扩展 Numba
- 6.1。高级扩展 API
- 6.2。低级扩展 API
- 6.3。示例:间隔类型
- 7. 开发者手册
- 7.1。贡献给 Numba
- 7.2。 Numba 建筑
- 7.3。多态调度
- 7.4。关于发电机的注意事项
- 7.5。关于 Numba Runtime 的注意事项
- 7.6。使用 Numba Rewrite Pass 获得乐趣和优化
- 7.7。实时变量分析
- 7.8。上市
- 7.9。模板注释
- 7.10。关于自定义管道的注意事项
- 7.11。环境对象
- 7.12。哈希 的注意事项
- 7.13。 Numba 项目路线图
- 8. Numba 增强建议
- 9. 术语表