# 3.11。使用 CUDA 模擬器 調試 CUDA Python
> 原文: [http://numba.pydata.org/numba-doc/latest/cuda/simulator.html](http://numba.pydata.org/numba-doc/latest/cuda/simulator.html)
Numba 包含一個 CUDA Simulator,它使用 Python 解釋器和一些額外的 Python 代碼實現 CUDA Python 中的大部分語義。這可以用于調試 CUDA Python 代碼,方法是在代碼中添加 print 語句,或者使用調試器逐步執行單個線程。
內核的執行由模擬器一次一個塊執行。為塊中的每個線程生成一個線程,并且將這些線程的執行調度留給操作系統。
## 3.11.1。使用模擬器
通過將環境變量 [`NUMBA_ENABLE_CUDASIM`](../reference/envvars.html#envvar-NUMBA_ENABLE_CUDASIM) 設置為 1 來啟用模擬器。然后可以正常執行 CUDA Python 代碼。在內核中使用調試器的最簡單方法是僅停止單個線程,否則難以處理與調試器的交互。例如,下面的內核將在線程`<<<(3,0,0), (1, 0, 0)>>>`中停止:
```py
@cuda.jit
def vec_add(A, B, out):
x = cuda.threadIdx.x
bx = cuda.blockIdx.x
bdx = cuda.blockDim.x
if x == 1 and bx == 3:
from pdb import set_trace; set_trace()
i = bx * bdx + x
out[i] = A[i] + B[i]
```
當使用一維網格和一維塊調用時。
## 3.11.2。支持的功能
該模擬器旨在盡可能在真實 GPU 上提供完整的執行模擬 - 特別是,支持以下內容:
* 原子操作
* 恒定記憶
* 本地記憶
* 共享內存:共享內存數組的聲明必須位于不同的源代碼行上,因為模擬器使用源代碼行信息來跟蹤跨線程的共享內存分配。
* 支持 [`syncthreads()`](../cuda-reference/kernel.html#numba.cuda.syncthreads "numba.cuda.syncthreads") - 但是,在發散線程進入不同的 [`syncthreads()`](../cuda-reference/kernel.html#numba.cuda.syncthreads "numba.cuda.syncthreads") 調用的情況下,啟動不會失敗,但會發生意外行為。未來版本的模擬器可以檢測到這種情況。
* 支持流 API,但與實際設備不同,所有操作都按順序和同步進行。因此,在流上進行同步是一種無操作。
* 還支持事件 API,但不提供有意義的計時信息。
* 與 GPU 之間的數據傳輸 - 特別是使用 [`device_array()`](../cuda-reference/memory.html#numba.cuda.device_array "numba.cuda.device_array") 和 [`device_array_like()`](../cuda-reference/memory.html#numba.cuda.device_array_like "numba.cuda.device_array_like") 創建數組對象。固定存儲器 [`pinned()`](../cuda-reference/memory.html#numba.cuda.pinned "numba.cuda.pinned") 和 [`pinned_array()`](../cuda-reference/memory.html#numba.cuda.pinned_array "numba.cuda.pinned_array") 的 API 也受支持,但不會發生釘扎。
* 支持 GPU 上下文列表(`cuda.gpus`和`cuda.cudadrv.devices.gpus`)的驅動程序 API 實現,并報告單個 GPU 上下文。這個上下文可以像真正的那樣關閉和重置。
* 支持 [`detect()`](../cuda-reference/host.html#numba.cuda.detect "numba.cuda.detect") 功能,并報告一個名為 <cite>SIMULATOR</cite> 的設備。
模擬器的一些限制包括:
* 它不執行類型檢查/類型推斷。如果 jitted 函數的任何參數類型不正確,或者任何局部變量類型的規范不正確,模擬器將無法檢測到。
* 僅模擬一個 GPU。
* 不支持對單個 GPU 的多線程訪問,這將導致意外行為。
* 大多數驅動程序 API 未實現。
* 無法將 PTX 代碼與 CUDA Python 函數鏈接。
* Warp 和 warp 級操作尚未實現。
顯然,模擬器的速度也遠低于真實設備的速度。可能需要減小輸入數據的大小和 CUDA 網格的大小,以便使模擬器易于調試。
- 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. 術語表