README

第8章 流处理器簇

流处理器簇(SM)是GPU中运行CUDA内核函数的部分。每一个流处理器簇包含以下部分:

  • 上千上万计的可以被划分到执行线程的寄存器;

  • 几种类型的缓存:

  • 用以在线程之间快速交换数据的共享内存;

  • 用以快速分发从常量内存中读取数据的常量缓存;

  • 用以从纹理内存中聚合带宽的纹理缓存;

  • 用以减少访问本地或全局内存造成延迟的一级缓存;
    ·线程束调度器,它可以很快地在线程之间切换上下文,并将就绪状态的指令发给线程束;

  • 整型变量与浮点型变量操作的执行核心,它可以进行:

  • 整形和单精度浮点数操作;

  • 双精度浮点数操作;

  • 特殊函数单元(Special Function Unit,SFU),用来执行单精度浮点数的超越函数(Transcendental Functions)操作。

之所以要有这么多寄存器,并且硬件可以如此高效地在不同的线程之间快速切换上下文,是为了最大化硬件的吞吐量。GPU拥有足够的状态来应对:在一个读指令执行后,数据从设备读出的数百时钟周期的执行延迟和访存延迟。

SM是多用途处理器,但是SM的设计与CPU执行核心有很多不同:SM的时钟频率要低很多;支持指令并行,但不支持分支预测和预测执行;它们没有或只有很小的缓存。在适合的工作量下,GPU的超强计算能力不仅足以完全弥补这些劣势,甚至会表现得更加强大。

从2006年的第一款支持CUDA的设备面世以来,SM的设计在不断的演化发展,产生了3次主要更迭:分别是代号为特斯拉、费米和开普勒的架构。开发人员可以通过调用CUDAGetDeviceProperties()函数查看CUDADeviceProp major和CUDADeviceProp minor,或者调用驱动程序API函数cuDeviceComputeCapability()来查看设备的计算能力。计算能力1.x、2.x和3.x分别对应着特斯拉架构、费米架构和开普勒架构硬件。表8-1汇总了每一代SM硬件中新添加的功能。

表8-1 SM功能

在第2章中,从图2-29~图2-32展示了不同SM的框图。CUDA核心可以执行整型和单精度浮点型指令;如果有一个双精度单元的话,还可以支持双精度运算;特殊函数单元实现求倒数、平方根倒数、正/余弦以及对数/指数的函数。线程束调度器在这些指令执行需要的资源变得可用时,将指令分发到这些执行单元。

本章主要聚焦于SM指令集的能力。有时,这也称“SASS”指令,这是CUDA驱动程序或ptexas翻译PTX中间码得到的本地指令。开发者不能直接修改SASS代码,但英伟达公司通过cuobjdump开发工具使这些指令对开发者可见,这样他们便可以通过检查已编译的微码来直接优化源代码。