# 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. 术语表