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