1.写在前面
前面的博客我们简单的介绍并行的处理器,这节我们介绍下GPU,一种新型的图像处理器。
2.GPU简介
最初将SIMD指令添加到现有体系结构中的理由是:许多微处理器被用于PC和工作站中图形显示器上,以至于越来越多的处理时间被用于图形上。随着处理器上的晶体管数量根据摩尔定律持续增长,改进图形处理效率逐渐成为一个值得研究的问题。
改进图形处理的主要驱动力来自计算机游戏行业。快速增长的游戏市场鼓励许多公司加大了在开发更快速的图形硬件上的投资,这种正反馈使得图形处理的改进速度比主流微处理器中通用处理快得多。
由于图形和游戏社区与微处理器开发社区的目标不同,因此它发展出了自己独特的处理风格和术语。随着图形处理单元计算能力的增加,它们被命名为图形处理单元或GPU,以区别于CPU。
只需要几百美元,任何人都可以购买到带有数百个并行浮点单元的GPU,这使得普通人进行高性能计算更容易了。当这种潜力与编程语言相结合时,GPU变得更易于编程,而大众对GPU计算的兴趣也在逐渐增长。因此,今天的许多科学和多媒体应用的程序员开始犹豫究竟是使用GPU还是CPU编程。
下面是一些GPU区别于CPU的关键特性:
- GPU是作为CPU补充的加速器,因此不需要能够执行CPU上的所有任务。这种角色定位同时也允许了GPU将所有的资源都用于图形。GPU在执行一些任务时表现很差甚至完全不执行,这也是被允许的,因为在一个同时拥有CPU和GPU的系统中,CPU可以根据需要执行这些任务。
- GPU的问题规模通常为几百MB到GB,而不是几百GB到TB。
下面是一些导致体系结构风格不同的差异:
- 也许最大的区别在于GPU不依赖于多级cache来消除内存的长延迟,但CPU依赖。与此相反,GPU依靠硬件多线来隐藏内存延迟。也就说,在存储器发出请求与数据到达之间的时间李,GPU执行了数百或数千个独立于该请求的线程。
- 因此,GPU的存储器面向带宽而不是延迟。甚至还有用于GPU的特殊图形DRAM芯片,这种芯片比拥有CPU的DRAM芯片宽度更大,并且就有更高的带宽。此外,GPU存储器通常比传统微处理器的主存更小。在2013年,GPU存储器的大小一般为46GiB甚至更低,而CPU存储器的大小为3222256GiB。最后,请记住,对于通过计算来说,需要将CPU内存和GPU内存之间传输数据的时间也计算在内,因为毕竟GPU是协处理器。
- 考虑到GPU需要通过多线程来获取良好的内存带宽,除多线程外,GPU还可以容纳许多并行处理器(MIMD)。因此,每个GPU处理器都比传统CPU拥有更多的线程,并且它们拥有更多的处理器。
2.1NVIDIA GPU体系结构简介
与向量体系结构一样,GPU仅适用于数据并行问题。这两种体系结构都具有聚集-分散数据传输,不过GPU处理器比向量处理器拥有更多的寄存器。与大多数向量体系结构不同,GPU还依赖于单个多线程SIMD处理器中的硬件多线程来隐藏存储器延迟。
多线程SIMD处理器类似于向量处理器,但是前者有许多并行功能单元,而不是像后者一样只有少数深度流水的功能单元。
GPU中包含一个多线程SIMD处理器的集合;也就是说,GPU是由多线程SIMD处理器组合的MIMD。例如,NVIDIA的Fermi架构有四种不同价格的具体实现,分别包括7、11、14或15个多线程的SIMD处理器。为了在具有不同数量的多线程SIMD处理器的GPU模型之间提供透明的可扩展性,线程块调度器硬件为多线程SIMD处理器分配线程块。具体的如下图:
让我们再向下深入一层细节,硬件创建、管理、调度和执行的机器对象是一个SIMD指令的线程,也称为SIMD线程。它是一个传统的线程,但只包含SIMD指令。这些SIMD线程有自己的程序计数器,它们运行在多线程SIMD处理器上。SIMD线程调度器包含一个控制器,该控制器知道SIMD指令的哪些线程已准备好运行,然后将它们发送到调度单元,以便在多线程SIMD处理器上运行。SIMD线程调度器与传统多线程处理器中的硬件线程调度器相同,区别仅在于它是调度SIMD指令的线程。因此,GPU硬件有两级硬件调度器:
- 线程块调度器,用于多线程SIMD处理器分配线程块。
- SIMD线程调度器,位于SIMD处理器内部,可在SIMD线程运行时进行调度。
这些线程的SIMD指令宽度为32,因此每个SIMD指令线程都将计算32个计算元素。由于线程由SIMD指令组成,因此SIMD处理器必须具有并行功能单元才能执行操作。我们称其为SIMD通道。
2.2NVIDIA GPU 存储结构
我们称每个多线程SIMD处理器本地的片上存储器为局部存储器。它由多线程SIMD处理器中的SIMD通道共享,但多线程SIMD处理器之间不共享此存储器。我们称整个GPU和所有线程块共享的片外DRAM为GPU存储器。
GPU不依赖于大容量的cache来保存应用程序的整个工作集,而是传统地使用小容量的流cache并依赖于大量的SIMD指令多线程来隐藏DRAM的长延迟,因为这些工作集的大小通常是数百MB。因此,数据集无法放在多核微处理的末级cache中。为了使用硬件多线程来隐藏DRAM延迟,GPU将在系统处理器中放置cache芯片的区域替换为计算资源和大量的寄存器,用以执行大量的SIMD指令多线程。
2.3对GPU的展望
从高层次来看,具有SIMD指令扩展的多核计算机确实与GPU有相似性。
上图总结了它们的相似之处和不同之处。两者都是MIMD,并且处理器都使用多个SIMD通道,尽管GPU具有更多处理器和更多通道。两者都使用硬件多线程来提高处理器利用率,尽管GPU支持更多线程的硬件。两者都使用cache,虽然GPU使用小容量的流cache,而多核计算机使用大容量的多级cache,试图完成包含整个工作集。两者都使用64位地址空间,尽管GPU中的物理地址存储器要小得多。虽然GPU支持页级别的内存保护,但它们还不支持动态页面的调度。
SIMD处理器也与向量处理器很相似。GPU中的多个SIMD处理器充当独立的MIMD核心,就像许多计算机具有多个向量处理器一样。按照这种观点,可以将Fermi GTX 580视为具有硬件支持多线程的16核计算机,其中每个核心具有16个通道。最大的区别是多线程,这是GPU的基础,而在大多数向量处理器中不存在。
GPU和CPU体系结构没有共同的祖先,并没有过渡环节来解释它们。因为这种不寻常的继承关系,GPU没有使用计算机体系结构社区中常见的术语,这导致了人们对GPU是什么以及GPU如何工作的困惑。为了解决这种困惑,下图列出这些关键的术语:
3.集群、仓储级计算机和其他消息传递多处理器
共享地址空间的替代方案是为每个处理器都提供私有物理地址空间。
采用这种替代方案的多处理器必须通过显示消息传递进行通信,传统上也罢这种类型的计算机称为显示消息传递计算机。只要系统具有发送消息例程和接受消息例程,就可以通过内置的消息传递进行协调,因为一个处理器知道何时发送消息,并且接收处理器也知道消息何时到达。如果发送方需要确认消息已到达,则接收处理器可以想发送方发回确认消息。
迄今为止,已经有多次基于高性能消息传递网络构建大型计算机的尝试了,而且这些尝试确实提供了比使用局域网构建的集群更好的通信性能。实际上,今天的许多超级计算机都使用了自定义网络。问题在于自定义网络比以太网等局域网更昂贵得多。由于过高的成本,除高性能计算之外,很少有应用程序会对其进行尝试。
一些并发应用程序在并行硬件上运行良好,与硬件是否提供共享地址或消息传递机制无关。特别是,任务级并行性和几乎没有通信的应用程序。集群已成为当今消息传递并行计算机中最普遍的实例。因为有单独的存储器,集群的每个节点都可以运行操作系统的不同副本。相较之下,微处理器内的核心使用芯片内部的高速网络连接,多芯片共享存储器系统使用存储器互联进行通信。存储器互联具有更高的带宽和更低的延迟,从而为共享内存多处理器提供了更好的通信性能。
将用户存储器分开存储,这种从并行编程的角度来看的弱点反而编程了系统可靠性的优点。由于集群由通过局域网连接的对立计算机组成,因此在不关闭系统的情况下更换计算机,在集群中很容易做到,但在共享内存多处理器中却不容易。从根本上说,共享地址意味着在没有操作系统做大量工作的情况下,在服务器的物理设计上很难隔离处理器并替换它。当服务器发生故障时,集群也可以轻松地按比例缩小,从而提供可靠性。由于集群软件运行在每台计算机的本地操作系统之上,因此断开连接并更换损坏的计算机更容易得多。
考虑到集群是由完整的计算机和独立、可扩展的网络构建的,这种隔离使得在无须卸载在集群之上运行的应用程序的情况下,扩展系统更加容易。
尽管与大规模共享内存处理器相比,集群的通信性能较差,但集群的低成本、高可用性和快速可扩展使得集群对因特网服务提供商具有吸引力。每天有数亿人使用的搜索引擎就依赖于这项技术。
3.1仓储级计算机
因特网服务需要建造新的建筑物,来对100000台服务器进行放置、供能和冷却。虽然它们可以被归类为大型集群,不过它们的架构和操作要更为复杂。这些计算机充当一台巨型计算机,建筑施工、电费、冷却基础设施以及连接并容纳这50000~100000台服务器的网络设备的成本约为1.5亿美元。我们将它们认为是一类新的计算机,称为仓储级计算机。
与普通的服务器有以下的三个主要区别:
- 大量、简单的并行性。
- 计算运营成本。
- 规模及与规模相关的机会和问题。
4.多处理器网络拓扑简介
多核芯片需要片上网络核心连接在一起,而集群需要局域网将服务器连接在一起。
网络成本包括开关数量、开关连接到网络的链路数量、每个链路的宽度,以及网络映射到芯片时连接的长度。网络性能也是多方面的,包括在无负载的网络上发送和接受消息的延迟、在给定的时间段内可以传输的最小消息数量的吞吐量、由网络的一部分争用引起的延迟,以及取决于通信模式的可变性能。网络的另一个责任是容器,因为系统可能需要在存在损坏组件的情况下工作。最后,在受能耗限制的系统里,由于不同组织架构导致的系统能耗的不同可能是需要考虑的最重要的问题。
网络通常被绘制为图形,图形的每条边代表通信网络的链路。在本节的图中,处理器-内存节点显示为黑色方块,开关显示为灰色圆点。我们假设所有链路都是双向的;也就是说,信息可以向任一方向流动。所有网络都由开关组成,其链路连接到处理器-内存节点和其他开关。第一个网络将一系列节点连接在一起:
这种拓扑称为环。由于某些节点没有直接连接,因此某些消息必须沿中间节点跳转,直接到达最终的目的地。
与总线(一组允许广播到所有连接设备的公共线路)不同,环能够同时进行多个传输。
由于多种拓扑可供选择,因此需要使用性能指标来区分这些设计。有两种很受欢迎的指标。第一个是总网络带宽,即每个链路的带宽乘以链路数量,代表峰值带宽。对于上述的环拓扑,如果有P个处理器,总网络带宽将是一条链路带宽的P倍;总线的总网络带宽就是该总线的带宽。
为了避免只只评价最佳带宽的情况,我们提供另一个更接近最坏情况的指标:二分带宽。通过将机器分成两半来计算该度量,然后将跨越假想分界线的链接的带宽相加。环的二分带宽是链路带宽的两倍,是总线链路带宽的一倍。如果单个链路与总线一样快,则在最坏的情况下,环路的速度时总线的两倍,在最好的情况下,它的速度时总线的P倍。
由于某些网络拓扑不是对称的,因此产生的问题是二分机器时在哪些绘制假想分界线。由于二分带宽是最坏的情况的度量,因此答案是选择可以产生最差网络性能的分区。换言之,就是计算所有可能的二分带宽并选择其中最小的一个。我们之所以采取这种悲观的观点,是因为并行程序通常会受到通信链中最薄弱链路的限制。
环的另一个极端是全连接网络,其中的每个处理器都具有到其他处理器的双向链路。对于全连接网络,总网络带宽为Px(P-1)/2,二分带宽为(P/2)^2
全连接网络对性能的巨大提升被成本的急剧增长所抵消。这种结果激励工程师去发明新的拓扑结构,使其既有还的成本又有全连接网络的性能。对结构的评估在很大程度上取决于在计算机上运行的并行程序工作负载的通信特点。
在公开出版物中已经讨论过的不同的拓扑结构的数量难以估计,但在商用并行处理器中只使用了少数的拓扑结构。
将处理器放置在网络中每个节点处的替代方案是:仅在这些节点中的部分节点处留下小于处理器-内存-开关节点的开关,这种开关规模更小,因此可以更密集地打包,从而减少距离并提高西能。这种网络通常被称为多级网络,以反映消息可能途径多个步骤后才能传播。多级网络的类型和单级网络一样多,全连接或交叉开关网络允许任何节点在通过网络时可与任何其他节点通信。Omega网络所使用的的硬件少于交叉开关网络,但消息之间可能会发生争用,具体取决于通信模式。
网络拓扑的实现
对本节中提到的所有网络,我们只做了简单的分析,而忽略了构建网络时需要考虑的重要因素。每个链路之间的距离会影响高时钟频率下通信的成本。通常,距离越长,以高时钟频率运行的成本越高。较短的距离也会使得为链接分配更多的电线变得更容易,因为如果电线较短,那么驱动这些电线所需要的功耗就更下,而且较短的电线比较长的电线更便宜。另一个实际的限制时:必须将三维的图像绘制到本质上其实是二维介质的芯片上。最后要关注的是能耗。
5.谬误与陷阱
谬误:并行计算机不遵循Amdahl定律
谬误:峰值性能可代表实际的性能。
陷阱:不开发软件来利用和优化多处理器体系结构
谬误:在不提升内存带宽的前提下可以得到不错的向量计算性能。
6.写在最后
本篇博客主要介绍了GPU的一些东西,至此组成就结束了。