3.GPU性能的背景

  • 2 replies
  • 131 views
*

sisiy

  • *****
  • 147
    • 查看个人资料
3.GPU性能的背景
« 于: 六月 16, 2019, 08:00:25 pm »
要理解特定层或神经网络如何有效地利用给定的GPU时,理解GPU执行的基本知识是有帮助的。

3.1 GPU的体系结构基础
GPU是一个高度并行的处理器架构,由处理元素和内存层次结构组成。在高层次上,NVIDIA gpu由多个流多处理器(SMs)、片上L2缓存和高带宽DRAM组成。算法和其他指令由SMs执行,数据和代码通过L2缓存从DRAM访问。例如,Volta V100 GPU包含80条SM、6 MB L2缓存和多达32 GB的HBM2内存,提供大约900 GB/s的带宽。
图1所示。简化的GPU架构视图

每个SM都有自己的指令调度程序和各种指令执行管道。乘法加法是现代神经网络中最常用的运算,它是全连通层和卷积层的构造块,两者都可以看作是向量点积的集合。下表显示了在NVIDIA最新的两种GPU架构(Volta和Turing)上,单个SM在每个时钟上对不同数据类型的多重添加操作。每个乘法加由两个操作组成,因此一个操作将表中的吞吐量乘以2以获得每个时钟的触发器计数。为了得到GPU的拖放率,可以将这些乘以SMs和SM时钟率的数量。例如,Tesla V100 SXM2 GPU具有80条短信和1.53 GHz时钟速率,峰值吞吐量为15.7 FP32 Tflops和125 FP16 Tflops(应用程序实现的吞吐量取决于本文中讨论的许多因素)。

图2。每个SM的每个时钟的乘法加操作


如图2所示,FP16操作可以在Tensor Core或CUDA核中执行。此外,图灵架构可以在Tensor Core或CUDA核中执行INT8操作。在Volta GPU架构中引入了Tensor Core,专门用于加速矩阵乘法和累加运算,用于机器学习和科学应用。这些指令操作在小矩阵块上(例如4x4块)。注意Tensor Core计算和积累积的精度比输入高。例如,当输入为FP16 tensor Core时,计算积的精度不会降低,在FP32中累加。当数学运算不能用矩阵块表示时,它们在其他CUDA核心中执行。例如,两个半精度张量的元素加法将由CUDA核来执行,而不是Tensor Core。
« 最后编辑时间: 七月 22, 2019, 02:14:47 pm 作者 sisiy »

*

sisiy

  • *****
  • 147
    • 查看个人资料
Re: 3.GPU性能的背景
« 回复 #1 于: 七月 22, 2019, 02:14:10 pm »
3.2. GPU 执行模式

为了利用它们的并行资源,gpu并发执行多个线程。

有两个概念对于理解线程数与GPU性能的关系至关重要:

gpu使用2级线程层次结构执行函数。给定函数的线程被分组为大小相同的线程块,并启动一组线程块来执行函数。
gpu通过切换到其他线程的执行来掩盖相互依赖的指令间的延迟。因此,有效利用GPU所需的线程数量要远远高于内核或指令pipeline的数量。

两级线程层次结构是gpu拥有许多SMs的结果,每个SM具有能同时执行很多线程的执行单元,并允许其线程通过共享内存和同步进行通信。在运行时,将一个线程块放在同一个SM上运行,从而使线程块中的所有线程能够有效地通信和同步。用一个线程块启动一个函数只会给一个SM工作,因此,要充分利用一个具有多个SM的GPU,你需要启动多个线程块。由于SM可以同时执行多个线程块,因此通常希望线程块的数量比SMs的数量多几倍。这样做的原因是为了最小化“拖尾”效应,在函数执行结束时只剩下几个活动线程块,因此在这段时间内GPU的利用率不足,如图3所示。

使用8-SM GPU时,12个线程块占用1块/SM的时间启动执行。这里,块在2个批次中执行,第一个批次使用100%的GPU,而第二个批次仅使用50%。(注意:这图假设了需要两个批次上Blocks给SM,但实际上的批次要远远超过的两个批次)

我们用名词"批次"代表了一组同时(上到SM里)运行的blocks,以几个批次启动线程块是(解决这个问题)最有效的---因为最后一个批次中,花费的时间百分比更少,从而最小化了拖尾效应。至于需要多少个blocks才需要考虑拖尾效应。这个和具体的kernel(以及资源使用情况有关),无法直接确定的。对于较高端的gpu,通常只有在少于300个线程块的情况下启动时才应该检查拖尾效果。
« 最后编辑时间: 七月 22, 2019, 02:55:05 pm 作者 sisiy »

*

sisiy

  • *****
  • 147
    • 查看个人资料
Re: 3.GPU性能的背景
« 回复 #2 于: 七月 22, 2019, 04:22:07 pm »
3.3. 理解性能

特定处理器上的特定函数可能会卡在三个方面之一:卡访存,卡计算,卡延迟

考虑一个简化模型,其中函数从内存中读取输入,执行计算操作,然后将输出写入内存。 假设Tmem时间用于访问内存,Tmath时间用于执行计算操作。如果我们进一步假设不同线程的内存和计算部分可以重叠,那么函数的总时间为max(Tmem, Tmath)。这两次中的较长时间说明了什么限制了性能:如果计算时间较长,我们说函数是卡计算,如果内存时间较长,那么它就是卡内存。
 
在内存或计算操作上花费多少时间取决于算法及其实现,以及处理器的带宽。内存时间等于内存中访问的字节数除以处理器的内存带宽。计算时间等于操作数除以处理器的计算带宽。因此,在给定的处理器上,如果Tmath > Tmem可以表示为:



By simple algebra, the inequality can be rearranged to:


左侧是算法的算术强度,即算法的具体实现的计算操作和访存的字节数之比。右侧则是(具体)处理器的算术操作和访存带宽的比率,也时候我们也叫ops:bytes比。因此,当一个算法的实现的算术强度,比处理器的ops:bytes比更高的值的时候,该算法的实现在该处理器上运行,是卡计算的。相反,如果算法的该比率比处理器的比率更低的时候,则卡访存。
我们将把算法的算术强度与NVIDIA vta V100 GPU上的ops:byte ratio进行比较


« 最后编辑时间: 七月 22, 2019, 04:42:26 pm 作者 sisiy »