找回密码
 立即注册
查看: 227|回复: 13

2.1.GPU硬件架构

[复制链接]
发表于 2023-3-4 12:16 | 显示全部楼层 |阅读模式
要想弄清楚CUDA执行模型,首先要弄懂NVIDIA GPU的硬件架构。
以Pascal GP100架构为例,图 2.1和图 2.2分别展示了NVIDIA GPU设备的整体架构和SM内部结构。


图 2.1 GPU设备的整体架构
整体架构中主要包括以下几个模块:
1) PCI Express 3.0:GPU与CPU的连接总线,负责传输指令和数据;
2) Giga Thread Engine:负责将线程块Block分配给SM;
3) SM: Streaming Multiprocessors,流多处理器,负责执行Block;
4) L2 Cache:二级缓存;
5) Memory Controller:内存控制器,负责访问显存;
6) Memcoy:显存;
7) High Speed Hub:HSHUB,高速集线器,负责GPU间的内存访问;
8) NVLink:GPU间的高速互联接口。
从整体架构看,我们发现GPU设备很像一个计算机集群,每个SM是一个小型计算机。CPU通过PCIe总线将任务部署给计算机集群的Giga Thread Engine,Giga Thread Engine再将任务分解,把子任务传递给小型计算机。这种描述是不是似曾相识,没错,在“CUDA核函数”章节中我们曾用一栋楼的比喻理解核函数中的线程层次,而这种比喻同样适用于理解GPU的硬件架构。


图 2.2 SM内部结构
SM内部结构中主要包括以下几个模块:
1) Instruction Cache:指令缓存;
2) Warp Scheduler:线程束调度器;
3) Dispatch Unit:指令分发器,根据Warp Scheduler的调度向核心发送指令;
4) Register File:寄存器;
5) Core:计算核心,负责浮点数和整数的计算;
6) DP Unit:双精度浮点数计算单元;
7) SFU:Special Function Units,特殊函数计算单元;
8) LD/ST:访存单元;
9) L1 Cache:一级缓存;
10) Shared Memcoy:共享内存。
从SM内部结构看,我们发现小型计算机SM接收到子任务之后,通过Warp Scheduler将任务再次分解,然后利用Dispatch Unit将分解的任务部署到该计算机的各个核心上。
现在,我们联系第一章内容做进一步思考,理清CUDA核函数与GPU硬件的对应关系。


图 2.3 CUDA核函数与GPU硬件的对应关系
CUDA核函数中为什么将线程分为三个层次,其实是与GPU的硬件组成相关联的。在GPU硬件中本身就存在三个层次——核心、流多处理器、设备,这是一种类似于计算机集群的层次结构,而我们编写的核函数正是运行在这种层次结构上,所以核函数必须支持这三个层次,否则任务无法顺利分解,也就无法从高层次向低层次传递。
实际设计中,CUDA将这种对应关系规定为:
1) Grid分配到Device上运行;
2) Block分配到SM上运行;
3) Thread分配到Core上运行。
■ 注意,GPU这个计算机集群有一个特点,各个SM之间只能通过全局内存间接通信,没有其它互联通道,所以这个集群只适合进行纯并行化计算。如果在计算过程中每个SM之间还需要通信,则整体运行效率很低。
■ 深入思考,为什么GPU硬件分为三个层次而不是两个层次?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-3-4 12:17 | 显示全部楼层
请问您在别的网站上连载其他章节吗,还是说这几篇文章是翻译自某本书呢?
[疑惑]
发表于 2023-3-4 12:24 | 显示全部楼层
目前写的内容没在其它网站上发过,内容都是阅读资料再加上自己的理解,如果你有什么疑问可以在评论区提出
发表于 2023-3-4 12:27 | 显示全部楼层
因为看到标题都是2.几,所以我以为还有1.几的章节[调皮]读完文章感觉收获很大,非常感谢[棒]
发表于 2023-3-4 12:37 | 显示全部楼层
确实有1.几,还在整理没有发出来,后续再添加
发表于 2023-3-4 12:39 | 显示全部楼层
[赞同]
 楼主| 发表于 2023-3-4 12:40 | 显示全部楼层
恳求大佬解答,为什么GPU硬件分为三个层次而不是两个层次?
发表于 2023-3-4 12:43 | 显示全部楼层
我认为是核函数的缘故,三个层次,程序员就可以指定每个block内部的大小和block的数量,这样每个block内部的1024(以Tesla V100举例)个线程就可以同时放到GPU上,可以灵活定义满足需求的grid
发表于 2023-3-4 12:51 | 显示全部楼层
我也见过只在一个block里面放一个线程的,我认为本质还是灵活和方便,可以根据需求裁剪设计,如果两层结构的话,直接放多少个线程,那么会给编程带来困难,这是目前的理解,可能还要深入学习下
发表于 2023-3-4 12:58 | 显示全部楼层
我的疑问是:为什么比如Tesla V100的GPU只有5120个Core,80个SM,但是执行的程序往往有几千个block,十几万个线程,那么是否是一个block对应了很多个SM,同时几个SM在运行一个block,比如V100的设计就是5个SM同时运行一个具有1024个thread的block。这样的话,是否是这几千个block分成几百批顺序执行
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-5 01:00 , Processed in 0.122930 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表