以我目前的理解,CUDA模型的硬件层次是GPU卡->流式多处理器(SMs)->核心,程序层次是内核->网格->块->warp->单线程。我想知道硬件和程序层次结构之间的对应关系。也就是说,一个内核通常是由几个网格组成的吗?网格包含在 GPU 卡中还是 SM 中?如果GPU卡中包含网格,GPU卡可以只包含一个网格还是多个网格?块是否对应于短信?一个 SM 可以只包含一个块还是多个块?一个块可以跨越多个 SM 吗?一个核心可以只执行一个线程还是多个线程?等等
1 回答
内核是在 GPU 上运行的函数。
网格是与内核启动相关的所有线程块。内核启动会创建一个网格。网格可以在整个 GPU 设备(GPU 中的所有 SM)上运行。网格由线程块组成。
线程块是线程组。为了执行目的,线程被分组为warp(32个线程),所以我们也可以说threadblocks是warp组。
线程块(它们包含的扭曲)在 SM 上执行。一旦线程块开始在特定 SM 上执行,它就会停留在该 SM 上并且不会迁移到另一个 SM。
SM 由内核组成。每个核心执行一个线程。核心执行引擎可能有能力一次处理多条指令,因此它实际上可以处理多个线程,但不能来自同一个warp。这部分变得复杂,对于初学者了解 GPU 的工作原理并不是很重要,因此考虑一个核心在任何给定时刻(指令周期)只处理一个线程是方便和有用的。
一个 SM 可以同时处理多个块。
请不要发布包含很多问题的问题。关于 SO 的问题应该显示一些研究工作。
对此类问题进行良好的研究工作需要从nvidia 网络研讨会页面上进行一些基本的网络研讨会,这只需要几个小时的学习。
先试试这两个:
GPU Computing using CUDA C – An Introduction (2010) 介绍使用 CUDA C 进行 GPU 计算的基础知识。将通过代码示例的演练来说明概念。无需先前的 GPU 计算经验
GPU Computing using CUDA C – Advanced 1 (2010) 一级优化技术,例如全局内存优化和处理器利用率。将使用真实的代码示例来说明概念