并行应用调试与内存检查技术解析
1. TotalView调试CUDA加速应用的挑战与特性
在调试CUDA加速应用时,TotalView面临着诸多挑战,同时也具备一些独特的特性。
1.1 扩展线程模型
TotalView原本就拥有强大的多进程和多线程应用模型。每个程序被建模为一组进程,这些进程可运行在一个或多个主机上,且每个进程由一个或多个线程组成。用户能够分别检查和控制每个线程。
CUDA运行时允许UNIX进程的每个线程将工作分配到连接的GPU设备上执行。这些工作被封装在抽象的“内核”单元中,GPU的并行架构使其能够同时执行数百个这样的内核实例,即设备线程。为了隐藏延迟,程序员通常会请求创建大量(数千个)设备线程。
设备无法同时处理所有线程,而是采用“流式”调度,将线程分批调度到硬件上执行。理想情况下,每个CUDA内核线程执行独立的工作单元,输入明确,且与其他同时执行的内核线程无副作用或依赖关系。但实际上,CUDA内核线程并非强制独立,它们可以访问全局和共享内存,这可能导致竞态条件和读取错误数据的问题。
为了让用户能清晰了解动态变化的CUDA内核线程集,TotalView为每个内核调用创建一个名为GPU焦点线程的单线程对象,并在调试器中与主机线程一同显示。用户可以通过新的GPU线程选择器控制显示的CUDA线程。CUDA线程可以使用两种坐标空间指定:逻辑坐标空间(以网格和块索引表示)和物理坐标空间(以设备号、流式多处理器号、warp号和lane号表示)。此外,TotalView还添加了CUDA设备显示窗口,用于显示硬件能力和当前映射到硬件资源的逻辑线程。
以下是线程模型相关要点总结:
|要
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



