CUDA编程之GPU硬件架构

时间:2022-07-22
本文章向大家介绍CUDA编程之GPU硬件架构,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

GPU的硬件架构

GPU的整体架构图

GPU实际上是一个流处理器簇 Streaming Multiprocessors(SM)的阵列。如下图所示:

GPU(G80/GT200)卡的组成模块图

需要指出,每个SM包含的SP数量依据GPU架构而不同,Fermi架构GF100是32个,GF10X是48个,Kepler架构都是192个,Maxwell都是128个。相同架构的GPU包含的SM数量则根据GPU的中高低端来决定

流处理器簇结构

每个SM(streaming multiprocessor)由以下部分组成:

  • CUDA Cores(CUDA核,也常称作SP(streaming processor))
  • Shared Memory/L1 Cache (共享内存/L1缓存)
  • Register File (寄存器文件)
  • Load/Store Units (加载存储单元)
  • Special Function Units (特殊功能单位)
  • Warp Scheduler(Warp调度器)

SM基本架构

GPU中的每个SM都支持数百个线程的并发执行,通常是每个GPU有多个SM,所以有可能有数千个线程并发执行。CUDA采用了SIMT单指令多线程执行,一个指令32个线程执行,32个线程组织成warp。一个warp中的线程同一时刻执行同一个指令。每个线程有自己的指令技术计数器和寄存器,在自己的数据上执行指令。

warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓 SIMT。

Warp的执行方式

当创建了一个kernel时,从逻辑上理解为kernel中的所有线程都在并行,但是从硬件物理条件上看同一时刻并不是所有的线程都在执行。因此Warp概念的提出,主要是将软件上并行的线程与硬件的实际架构连接起来。如下图所示:

Warp连接软硬件

warp是SM上的基本执行单元。当一个线程块分配到一个SM上时,线程块被组织成warps,SM上的warp调度器选择合适的warp执行。

warp执行示意图

warp一定是同一个block中的,如果一个block中的threads不足32个,则补足成为32个构成一个warp。

如图所示,本来只需要80个线程,但是实际上仍然需要32*3=96个threads,尽管最后一个warp的16个线程没有使用,但是仍然会消耗SM上的资源,比如共享存储器、寄存器。

Warp分支

定义:一个warp中的线程执行不同的指令,叫做warp分支。 如果warp发生分支,则需要顺序执行每个分支路径。

warp分支示意图

在一个warp中所有线程都必须具有两个分支if…else….一个warp中如果有线程的条件为true,则执行if子句,其它为false的线程将等待if执行完成。然后执行else语句,当条件为true的线程则等待else执行完成。 为了获得更高的性能,尽量避免warp分支,warp是32个连续的线程,在算法允许的情况下,可以将数据分割,使同一个warp避免分支。

软件与硬件并行对比

软硬件对比图

通过上图可以看出,一个网格相当于一个GPU设备,网格下分成多个线程块,线程块则对应的SM,每个线程块又分为多个线程,每个线程相当于一个CUDA核

参考

CUDA编程指南3.0 [【CUDA】学习记录(3)-硬件结构]https://www.jianshu.com/p/2fbd02311266