# 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. 術語表