以Fermi GPU为例:
左侧是一个粗略的GPU架构图,可以看到GPU由“显存”和“计算单元”组成,有以下几个部分:
-
DRAM:Dynamic Random Access Memory,即GPU的显存,容量较大,速度慢,CPU和GPU都可以访问。DRAM相当于CPU的RAM,里面存放的数据断电就没有了。
-
SM:streaming multiprocessor,即计算单元,一个GPU有多个SM。CPU可以使多核的,比如四核八核,而GPU的核心就特别多,一个SM里面包含多个核心(core)。
-
L2 Cache:这是一个二级缓存,比如当我们在CPU上执行100个1相加的时候,首先计算1+1,将结果2保存,再继续计算2+1,如此循环。但是由于在内存上读写数据耗费时间,我们只需要将中间结果保存在缓存里面,将最后结果写入内存即可。所有缓存大致就是这个作用。
每一个SM的架构如同右边所示:
- Core:每一个SM里面包含的多个核心。
- SP:Streaming Process(图中没有),一个SM有多个SP,SP是最基本的处理单元,最后的指令和任务都是在SP上完成的,现在SP的概念被弱化,用线程(thread)代替,一个SP对应一个thread。(这里或许理解还有些问题,因为我查资料发现又有些说法是SM和Streaming Process是同一个东西,而前面说的一个SM有多个SP是指Scalar Processor)
- Warp:在SM里面将SP(thread)进行分组,一般每32个thread称为一个warp,GPU里面有一个叫Wrap Scheduler的调度器,确保每一个Warp即这32个线程里面执行的内容是相同的。
- Dispatch Unit:指令分发单元,指令分发单元和执行硬件之间有一个完整的交叉开关(Crossbar),每个单元都可以向 SM 内的任何单元分配线程(不过存在一些限制)。
- LD/ST:load/store,用于内存操作的,读取单元。
- SFU:special function unit,来执行超指令(transcendental instruction)如正弦、余弦、倒数和平方根等函数。每个 SFU 一次执行一个线程块中一个线程的一条指令。
- register和L1:都表示缓存,不过GPU里面关于缓存的知识较为复杂,之后会列出。
其他补充
- GPC:Graphics Processing Cluster,图形处理集群,一个GPU有多个GPC,一个GPC包含多个SM。
- SPA:streaming Process Array,SP的阵列
- Register File:简称RF,是寄存器
每一个Core架构:
如图所示是GPU里面Core部分的架构,在了解Core之前首先要知道什么是异构计算:
异构架构计算:GPU和CPU协同工作,CPU端称为主机端用host表示,GPU端称为设备端用device表示。GPU和CPU连接一般协议是PCI-E,速度可达16G/s或者32G/s,最新的协议有NVme,延迟更小。
每一个Core里面包含多个Grid,每一个Grid里面包含多个Block,每一个Block里面包含多个thread。在运行代码时会涉及到对于线程的分配,我会在之后的学习笔记中贴出。
文章中图片出自:哔哩哔哩阿婆主:洞主2233的教学视频第二节