硬件和核数量的意义2014

NVIDIA Kepler GPU里面有十几个SMX,每个SMX的组成结构如上图,内含192个处理单精度数据的CUDA Core,2000+核心就是SMX的数量 * 每个SMX内部的CUDA Core数量得出的。

问题就在这里,现在的GPU可以被看做是基于Streaming Processor的众核架构,这里的“核心”,其量级是跟多核CPU里面的“核心”完全不可同日而语的。

CPU和GPU的核心用途完全不同,不是很好比较,我想了一下觉得可以用SIMD的角度来分析一下。NVIDIA所说的CUDA核心其实只负责执行SIMD中的一个line,许多个CUDA Core才能构成一个完整的SIMD阵列。 这是Kepler前代——Fermi的CUDA核心。一个CUDA Core负责SIMD的一个line

而CPU核心里面的SIMD部件其实是一个完整的SIMD阵列,反观GPU,许多个CUDA Core才能构成一个完整的SIMD阵列。

但是这样比也有问题,SIMD阵列的宽度是不一样的,以现在256bit 宽度的CPU内部SIMD为例,如果以32位单精度数字为一个line,那么就可以跑8个line,双精度的话是4个line。相比之下NVIDIA 的CUDA核心只是负责一个line,而SMX可以同时跑192个单精度line,64个双精度line

从这个角度我们可以给核心的量级做一个排序。NVIDIA SMX > CPU Core > CUDA Core

把CUDA Core与CPU Core相提并论是不对的。“核心”是一个很模糊的概念,有的核心大,有的核心小,而且功能不同,单纯比较核心数目是没有什么意思的,就像比较飞机发动机数目和火车发动机数目一样,关公战秦琼。以上拿SIMD宽度说事,只为给出一个感性理解。

我个人很喜欢GPU和CUDA,当时买笔记本很有远见地买了带Geforce的,但NVIDIA宣传GPU和CUDA的时候,有些地方可能不是很恰当,比如把SIMD的一个line包装成CUDA Core,把一次SIMD操作改称为Warp之类,颇有误导性,我也是看了最新版的量化才恍然大悟。

======================================================================
更新1. 上面这句说“一次SIMD操作改称为Warp”是错误的,一个warp是一组CUDA线程的集合,warp内部在没有分支的情况下同步执行指令。抱歉我读CUDA已经是一年前,有些概念生疏了。NV所出的两本CUDA书我都从头到尾读过,Stackoverflow上也有我贴出、被选为最佳答案的CUDA代码,自信理解本质无问题。感谢评论区中张亚、张扬二位提醒。

更新2. GPU核心和CPU核心并无可比性是毋庸置疑的,但是我认为单纯给出一个“并无可比性”的论断也没有多大意义,无助于理解本质所在。GPU VS CPU的区别可以从很多角度来看,SIMD只是其中之一,希望看到其他人贡献更多好的回答。

====================================================================

更新3. 下面这段文字尝试从微结构演化的角度来分析对比GPU和CPU,摘自我给某纸媒写的一篇专栏,贴在这里当抛砖引玉吧。GPU的演化除了从微结构角度看以外,图形学也是不可忽视的一个驱动因素,这部分我不是很熟,希望有人能出来写一个好答案。

翻阅上世纪八十年代末期至九十年代中期的论文,便不难发现,当时学术界与工业界热衷于具备宽发射、长流水,乱序执行、分支预测能力的CPU,认定这将是未来的发展方向,这些技术的研究热火朝天,有的学者甚至乐观地展望,未来将出现每周期15发射以上的惊人前端发射宽度,这样激进的宽发射CPU当然并未成为现实,作为对比,Haswell架构的发射宽度为4(因为可以发射融合微指令,所以实际等效发射宽度稍高),安腾2架构在编译器调度的帮助下也只能做到12发射。这种乐观预期的存在很好地反映了当年的时代局限。九十年代微架构设计的主流观点是,若想提高计算速度,加强CPU核心的执行能力是重点。在这样的指导思想下,著名的Intel P6微架构诞生了,双发射+长流水+乱序执行+分支预测一应俱全,核心频率越来越高,逻辑越来越复杂,直至NetBurst架构的高频奔腾4芯片折戟沉沙。 

重新审视当时的失败原因,主要有两个。 

其一,功耗墙(power wall)。用以加强CPU核心执行能力的这些技术将大幅推高功耗,以乱序执行为例,每一条指令的发射和执行都需要经过一整套逻辑的检查以确保流程正确,并占用额外的寄存器,这意味着每一条指令的执行都需要更多功耗。这种愈发激进的CPU设计在Netburst架构时代迎来顶峰,随后狠狠地撞上了功耗天花板。前Intel副总裁Patrick Gelsinger曾在2001年的国际固态电子电路会议上发表主题演讲,警告说CPU的功耗密度如果继续提高,不出几年就将摆脱现有一切冷却手段的束缚,彻底失去控制。更加不妙的是,仿真结果揭示,即便倾尽全力,给定无限多的芯片面积预算去设计一个发射宽度远超当下,配备极强的乱序执行能力和分支预测器的CPU,其整数指令发射能力也不过提高区区几倍,这样的设计思路下,改进潜力已经不大。


其二,访存墙(memory wall)。愈发激进的CPU设计将CPU核心的执行速度提得很高,存储器系统已经越来越力不从心。提供足够大的存储容量和提供足够快的响应速度在本质上是矛盾的,冯诺依曼早在1945年就断言容量和速度的需求无法同时满足,这位大师级人物不幸再度言中,存储器系统越来越难以用足够快的速度交付和接受指令与数据,引发了架构设计者们的担忧。DEC公司Alpha架构的首席架构师理查德·赛特斯在1996年的《微处理器报告》上撰写了一篇标题为《瓶颈在内存,愚蠢!》的惊世雄文,据他披露的测试结果,当时最出色的乱序超标量处理器若是管线填满,理论上每周期可以完成两条左右的指令,而实际执行时每四到五个周期才会有一条指令完成,落差几乎达到十倍,花费学术界与工业界无数心血研究测试的超标量乱序执行并未如想象中那样强大,优势几成泡影。这项测试非常有力地证明,整个执行模式存在极其严重的瓶颈,制约了整个CPU的性能,而这个瓶颈就在于访存速度。花费如此大的精力设计的高性能CPU,却花费了90%的时间等待存储器系统的响应,这不能不说是一种莫大的讽刺。赛特斯不无悲观地认为,在未来的处理器微架构设计中,存储器系统将成为唯一的关键因素。


面对这些挑战,业内已有一些较有远见的架构师开始讨论另一种全新的架构设计方式,他们设想抛弃高能耗的复杂乱序执行核心,转而采用设计精巧简单,功耗较低的小核心,将设计重点放在提高对存储器系统的延迟容忍上,依靠多核心多线程并行执行来躲避存储器系统的延迟——这便是后来NVIDIA GPGPU的核心设计理念之一。


计算机上运行的程序种类繁多,有的程序代码包含大量分支(例如编译器,人工智能,电路真值表生成),需要CPU拥有强大的分支预测器,有的程序代码频繁取用数组元素(例如矩阵计算),对CPU的访存能力提出了很高要求,设计一个万能型的CPU,要求它运行所有种类的代码都能拿出最快速度,这是极其困难的,但是如果能够区分程序类型,针对性地设计多种处理单元,令其分工合作,则有可能满足所有需求,这被称为异构计算。


在讲述GPGPU的运算优势之前,我们先来看看初中数学水平的简单向量加法。考虑两个宽度为16的向量相加,{1,2,3,…,15,16} + {1,2,3,…,15,16} = {2,4,6,…,30,32},不难发现,其中每组对应数字的相加,相互之间并不干扰,不存在相关性,而且没有分支,可以完美地实现并行。只需让一条加法指令同时控制十六条逻辑通路,引导十六组寄存器中的数据进入ALU,再同时写回寄存器,就可以并行做完这个宽度为16的向量加法,用体系结构的术语来说,这被称为宽度为16的SIMD执行(单指令多数据)。


研究显示,与此例类似的向量计算代码经常出现在某些特定种类的程序中(例如图像编解码)。因此,这种能够一次处理多组数据的SIMD处理单元就可以考虑作为GPGPU的基本构建模块,以NVIDIA Fermi架构的GTX 480为例,它内部的SIMD处理单元宽度为16,整个核心拥有16个这样的处理单元,一个时钟周期就能完成256 FLOPS的运算量,这个并行计算的宽度是惊人的,但是强大的并行能力背后需要寄存器或者存储器系统的支持。如果每个操作数都由内存提供,那么每进行一次单精度计算都需要内存系统提供2KB数据,显然这是难以达到的。如此大的访存压力需要使用其他技术进行分摊。


因此,GPGPU通常具备数量庞大的通用寄存器组,尽量使数据保存在本地,同时每个SIMD处理单元都具备多线程的硬件支持,例如Fermi的每个SIMD内部都设立了一个包含48线程的调度表,能够在当前线程发生访存停顿时迅速切换至其他线程,通过多个线程的重叠执行来隐藏访存延迟。除此之外,GPGPU的内存控制器也支持Gather-Scatter操作,能够应对部分不规则的内存位置访问,对接的内存系统也是经过特别设计以实现更高带宽。从图中可以看出,GPGPU的核心内部的缓存所占面积也很小,绝大部分芯片面积都用来构建逻辑运算单元和数据通路。相较之下,CPU则依靠更大的缓存来弥补内存缺憾,缓存所占芯片面积达到50%是常事,历史上甚至出现过HP 8700这样的奇葩架构,缓存所占面积几乎达到四分之三。


经过这样设计的GPGPU架构,其控制逻辑相对简单,一条指令便可以控制极宽的数据通路,而数据通路可以按照需求进行关闭,缩减功耗,因此这种架构能够带来更好的能耗表现,这便是架构设计师们对功耗墙问题所做的应对措施之一。再来看访存墙,GPGPU的线程并行度很高,来回切换线程的做法能更好地容忍内存延迟,但是对内存带宽需求更高,而且要求访存更加局部化。当计算任务的相关性很弱,几乎不存在分支,且内存访问模式比较规律的时候,GPGPU能够以更快的速度执行完毕,这部分优势是GPGPU截然不同的设计思路所带来的,也是传统CPU难以企及的,在GPGPU上实现较高计算加速比的通常就是这类程序。但是GPGPU也并非万能,它处理分支的能力很弱,目前大多依靠谓词执行,如果让GPGPU来处理分支较多的程序,SIMD单元就会在各种指令路径间来回切换,效率大打折扣。例如,给定一个宽度为16的向量,根据每个数字的奇偶性来决定执行路径,偶数则执行乘法,奇数则执行除法,那么就无法再依靠单一指令指挥整个向量数据流了,而这种工作在CPU上却得心应手。此外,若计算任务出现较强的相关性,程序员就很难编写并行化的代码,这部分任务也很难在GPGPU上执行。因此,可以预见CPU+GPGPU需要在以后的时间里分工合作,让CPU凭借强大的分支预测和快速串行执行能力来处理串行化代码,而GPGPU处理并行化的代码,以这种异构计算的方式实现更高的效率,NVIDIA的CUDA编程语言和GPGPU执行架构便是基于这样的思路设计。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值