进入21世纪第二个十年后,由于摩尔定律接近失效、制造工艺也逐渐逼近了物理极限,传统依靠不断压榨工艺和集成大量晶体管来获取计算性能提升的方法效果渐弱。在这种情况下,人们开始转变思维,希望通过改变设计,转而注重优化效率来尽可能的榨取目前PC架构的性能。异构计算,就是这种思想下的产物,它的目的是打破并行和串行的鸿沟,让计算在系统的管控下,自动的进入高效率的部件进行处理。今天,本文就为大家介绍异构计算的新联盟——Heterogeneous System Architecture异构系统架构(简称HSA)的方方面面。
溯及源头,HSA和GPU通用计算有着难解难分的关系。早在2001年,就有人利用显卡的纹理单元作为数据存储设备,进行矩阵计算操作。随着GPU可编程化的进一步发展,GPU上可编程的顶点单元也被用于解决矩阵乘法。在GPU进入统一架构时代后,GPU并行计算更是大张旗鼓的发展了起来,NVIDIA提出的CUDA、微软自有的DirectCompute以及开放组织的Open CL,都不约而同的将目标瞄准了GPU通用计算领域。当然,如果说通用计算的重点在GPU上、目的是为了开发GPU本身的计算潜能的话,那么随后出现的异构计算,目的就是为了更合理地使用计算机中不同组件的性能。
从计算机发展角度来看,早期的计算机使用的多是不可编程组件,这些组件对单一任务的执行效率非常高,不过功能固定,无法执行固定操作外的操作。随着计算机结构和体系越来越大,当从全局考虑时,这些固定功能组件往往包含着强大计算能力,但无用武之地(比如早期的图形芯片,没有或仅具有极为初级的可编程能力,像素和顶点管线都只能执行固定功能)。随着可编程化的发展,这些传统的固定功能的组件拥有了可编程性,它们也开始执行不同的计算。但是在全局来看,这些不同的组件依旧有着各自不同的特点,比如CPU擅长串行化,GPU则擅长并行化,都拥有各自擅长的计算领域。这样一来,如何将不同功能的计算组件联合在一起计算,就是被称之为异构计算的研究方向。
有了异构计算,肯定有同构计算,为什么同构计算没有成为未来计算的主题呢?同构计算就是相同的组件之间联合、强化。比如多核心CPU、并行多块GPU等。同构计算的特点是扩展很容易,计算安排很简单,性能在阿姆达定律有效范围内时,呈现非常好的接近线性增长的增幅——换句话来说是在一定数量的并行幅度内部,数量越多就性能越强,无论是芯片之间的同构并行还是芯片内部的架构并行性都是如此。但是并行数量增加后,根据阿姆达定律,性能的增幅会大幅度缩减到后几乎没有增幅。不仅如此,同构计算还涉及到整个系统内部和系统之间并行时如何安排、如何设计等重要问题,这些反映到实际运作中,往往需要极高的成本才能实现性能的增长。在PC上的同构计算发展一直在持续,不过仅限于多核心CPU和目前体系结构越来越庞大的GPU,它们都是在芯片内部完成了同构计算的进一步加强。芯片之间的同构计算出了SLI、CF等用途外,在民用PC上基本看不到用武之地了。
阿姆达定律是计算机科学中的一个重要定律。它定义了加速比,代表了处理器并行计算后效率提升的能力。阿姆达定律指出,并行计算总有一个上限,当并行到一定程度时,无论如何增加处理器的数量,都不会带来性能提升。阿姆达定律实际上指出了并行计算中存在的不可并行性。
阿姆达定律的存在,让妄图以不断增加并行性来提高性能的人们失望,也开启了异构计算的想法。当然,当前的技术制造的并行设备还没有达到阿姆达定律中的上限,因此阿姆达定律短期内不会对计算机造成特别明显的影响。
同构计算发展存在瓶颈,而且在短期内没有很好的解决方法,芯片内部的同构也无法无限扩大。在这种情况下,异构计算就成为未来PC、移动计算设备提高性能、提高使用舒适度和提供更多功能的重要手段。根据AMD的设想,未来新一代的应用程序将使用更为自然的用户界面、更大的显示器、更多的像素、更偏向社交和游戏以及云计算等,这些应用的发展都离不开CPU和GPU的进一步强大。因此,需要更为强大的计算平台来承担未来的计算任务。这些问题很可能会由于异构计算的发展得到非常好的解决。为了进一步发展异构计算,也为未来的市场打下基础,AMD联合ARM、高通、德州仪器、三星等厂商,在2013年1月开创了HSA基金会,并确定了以HSA命名的异构系统的处理器架构(Heterogeneous SystemArchitecture,异构系统架构,后文对该架构一律简称为HSA)。
HSA基金会的目的在于发展和推动异构计算,在GPU和CPU硬件架构、软件层面的融合和发展上做出贡献,培育异构计算市场,让异构计算在PC、移动计算中成为主流。HSA基金会的成立,标志着异构计算生态圈初创完成,上述厂商将会联合后来的加入者和学术单位一起完成异构计算的研究和推广。
在异构计算中,为活跃的厂商是AMD。AMD不仅是异构计算的创始人,还在从2012年开始就在旗下产品PU中尝试了CPU和GPU硬件层面的融合。那么,AMD是如何看待异构计算的,又带来了那些新鲜的创意呢?
AMD在异构计算中做出了很多探索。在HSA的官方内容中,MD也展示了他们在异构计算上的一些研究成果。那么HSA异构计算的优势在哪里呢?我们可以从AMD的研究文档中一窥究竟。
目前的异构计算依旧是基于CPU和GPU两大性能提供组件来进行的。从CPU和GPU的设计目标来看,它们各自存在如下的特点:
CPU:设计目的是为快速执行单一指令流而存在。换句话说,CPU在串行计算上拥有先天、绝对性的优势。在CPU架构中,CPU设计了乱序执行、寄存器、分支预测以及相对庞大的缓存体系,这些设计的目的都为了加速单一的线程的计算。由于有庞大的缓存存在,CPU能够以非常低的延迟和非常高的命中率获得数据,不过劣势也同样明显,缓存占据了CPU中大部分面积不说,还消耗了很大一部分电能。
GPU:设计的目的是为了快速执行大量并行指令流,也就是GPU在并行计算上有架构上的绝对优势。在GPU架构中,设计人员将晶体管用于流处理器阵列、多线程管理和内存控制器,相对的缓存并不大。不过缓存在GPU中的使用依旧非常重要,GPU需要使用缓存来“ 放大”带宽,将急需的数据存储在缓存中等待使用。当数据无法即时存取时,由于GPU内部会运行上千个线程,GPU可以通过切换到别的线程来掩盖掉由于缓存相对不足而带来的延迟。目前的新的GPU大部分架构基于SIMT单指令多线程,每个线程都允许有不同的分支。
可以看出,GPU和CPU有各自不同的计算优势。目前也有一部分异构计算基于PC中GPU和CPU分开的设计。比如NVIDIA支持的CDUA,这种结构实现简单,不过问题也不少。
CPU+GPU的异构计算主要问题还是带宽。目前的PCI-E3.0总线多可以提供32GB/s的双向带宽。虽然相比传统的PCI-E2.0或者内存总线来说,PCI-E3.0 x16的带宽已经不错了,但这是基于CPU和GPU分别拥有大容量内存(显存)的情况。此时GPU会将大量的数据存放在本地的高速显存中准备随时使用。这样的设计存在一个很明显的问题,就是GPU和CPU之间的数据调用和传输瓶颈问题。CPU调用GPU的数据需要跨越PCI-E总线以及GPU的显存控制器终才能到达数据存放处,数据返回的路程和延迟都让人难以接受,这种GPU和CPU在架构上彻底分开的设计方式需要在一次计算拥有很大数据规模时才显得颇有效率。此时数据可以通过PCI-E总线一次性传输到显存中,GPU计算完成后再传输回来。从编程模型来说,这种传统架构在程序编制上难度显得很高,并且灵活性相当差。而且由于传输瓶颈的存在,CPU和GPU之间随时随地调用数据变得非常困难。不仅如此,目前的计算架构需要人员手动去将计算任务分配在相关硬件上执行,系统很难确定哪些属于GPU计算而哪些又属于CPU计算,不够智能而且相当繁琐。
在进一步的发展中,AMD提出了APU的设计方式。APU的设计特点在于CPU和GPU被放置在一块晶圆上,CPU和GPU内部通过统一的高速总线链接。由于不需要执行接口切换和PCB板上布线,芯片内部的数据传输速度变得非常快。在这种设计中,CPU和GPU模块还采用了完全相同的内存控制器接口(当然CPU的内存和GPU的内存依旧分开存放,内存一致性还需要进一步加强),这就为未来HSA异构化的系统进一步发展打下了基础。
在这种新的设计中,GPU和CPU之间的传输延迟降低、带宽提高,GPU和CPU能够更紧密的互联在一起。在执行任务中,CPU和GPU可以不用等待大量的任务到来后一次传输,而是随到随处理(理想状态)。效率上要比传统PCI-E总线的设计要高不少。
这还没有结束。在AMD的设想中,内存一致性将成为HSA终成功的后一道壁垒。在AMD为HSA设计的架构中,CPU和被称为HSACU的单元一起挂接在统一致性内存共享单元上。其中PU依旧是原始的CPU架构,但是GPU已经被彻底分开成为HSACU单元。如果熟悉A MDGCN架构的读者可能还记得,AMD的流处理器簇被称为CU,一个CU中拥有16个SIMD单元,一个CU一次可以执行64个单精度混合乘加运算。在这里的HSACU,实际上就是在HSA化后,CU单元的地位会从传统的图形处理单元变成加速单元,它和CPU的关系类似于加速处理器和中央处理器。这样一来,HSA才能充分发挥“异构”这两个字的本质含义。
在这种佳的HSA结构中,根据AMD的设想,数据会被存放在共用的统一内存单元中,编程人员再也不需要为数据在GPU和CPU中来回转移和传递苦恼了。无论是CPU还是GPU,都可以去统一的内存池中调用所需要的数据,并在处理完成后将其存储在统一的内存池中。在整个HSA架构进一步成熟后,编程人员只需要给出具体任务即可,系统会根据任务的类型,来将其自动分配给HSACU或者CPU单元来计算。让合适的任务,自动去合适的硬件部分执行,只有这样的HSA结构,才能够真正发挥出异构计算的优势,打破壁垒,突破性能束缚。
AMD在目前的APU上实现的架构,CPU和GPU的传输不再是瓶颈。
对于实际的软件厂商而言,了解硬件架构是一回事,要不要在商业化中使用硬件架构,又是完全另一回事情了。如果一个新的硬件架构,需要软件开发人员学习相当多的内容,并且使用起来和传统产品大相径庭,需反复调试并积累经验才能完成工作的话,那么这种硬件架构除非业内独树一帜、非它莫属,否则将会很难推广。HSA在一开始就极力避免这种情况的出现。
HSA宣称自己的编程更为简单并符合标准化,支持的语言也包括了C++、Python、Java等,其中C++在Windows平台使用较多,Python则较多的用于CUI开发、科学计算程序、逻辑计算和服务器等,Java目前也是使用很广泛的语言,在移动平台上有相当强的优势。也就是说,HSA已经开始准备支持目前主流的应用品台并获取程序员等的支持。
AMD给出的一些资料,说明了HSA架构在软件支持上的结构。根据AMD的说明,目前基于驱动程序的软件结构,需要域库(Domain Libraries)的支持,应用程序会接入Open CL的接口后,进入图形核心驱动,后再在硬件上执行。
基于HSA的架构运行任务时有所不同,如果程序需要的话,会优先使用HSA的域库,Open CL也升级到2.0版本,此外还有HSA Runtime和HSAJIT的辅助,在经过任务队列库(Task Queuing Libraries)的调配和HSA核心驱动后,进入硬件部分执行。其中的核心内容是HSA的相关库文件和runtime文件。
HSA的相关库文件和Runtime文件和融合核心驱动连接(也就是上文的HSA核心驱动),可以为OpenCL、Java、Python的不同应用程序提供接口,让这些应用在HSA硬件上无差别的兼容运行,并自动获取相关的并行加速。AMD没有说明HSA并行加速的情况,但是给出了HSA Bolt的相关内容。HSA Bolt是HSA的并行基础库文件,提供了一些基础、常见的并行计算加速功能,比如扫描、排序、转换等内容,都可以利用HSA Bolt进行加速处理。特别值得一提的是,HSA的Bolt的CPU和GPU部分共用一个代码库,这就意味着程序编制人员不需要为CPU和GPU分开编写程序。不过仅有这一点目前看起来是不够的,并行化的难题本来就不是一朝一夕可以解决,HSA也只是做出了一些初步的尝试而已。由于一切都处于初级阶段,因此可以估计的是,HSA早期对并行化的加速可能在绝大部分应用程序中都不会特别明显,或者不会获取相对传统CPU+GPU分离式架构更为明显的性能优势,还需要等待HSA进一步的发展和联盟内各家厂商进一步的努力。
HSA其余的一些优势也很显著。比如HSA提供了针对JAVA的优化语言—APARAPI。APARAPI宣称可以将JAVA语言即时转换为HSA上可以执行的Open CL语言。开发人员在创建JAVA代码后,使用标准的编译器便宜为类文件后,可以选择在支持OpenCL 1.1以及以上版本的设备上执行,进行G PU加速,或者通过线程池运行,都能获得可执行的效果。AMD目前还在进一步测试H SA的一些优化设计,比如HSA RuntimeL LVM优化器等,希望可以进一步提高效能。
总的来说,HSA的软件架构是基于Open CL的优化设计,借助于HSA独特的硬件设计和hUMA的结构,HSA将带来低延迟、高效率、C P U和G P U共享指针等特色的设计,为异构计算铺平在软件设计上的道路。对一些需要额外操控底层硬件的人员来说,H S A的存在并不意味着他们和硬件之间建立起了无法逾越的高墙,设计人员也可以使用传统的方法优化硬件性能,H S A也提供了相关的底层编程接口,方便程序人员完全控制硬件架构并获得终极的性能加速。
并行计算对HSA的重要性不言而喻,但是目前并行计算是业内大难题,HSA也只是提供了初步的优化和支持。
HSA还有大量的问题需要解决。AMD也给出了部分HSA课题。
作为一种新事物,HSA暂时没有实际的软件应用案例。AMD之前宣称APU可以对数千种软件进行加速处理,其中绝大部分都是已经在目前的CPU+GPU架构上获得了加速应用的产品,APU对它们的宣传更多意义上是出于市场目的。真正意义上HSA的加速应用,AMD给出人脸识别的案例。
AMD使用达芬奇著名的《蒙娜丽莎》为例,来证明HSA在加速计算上的优势。根据AMD数据,对高清的图片进行人脸识别的计算,可能需要动用380万个搜索框,每个搜索框平均尝试124个特征点,每个特征点计算约100次,终每帧图像需要470亿次计算。如果对实时的1080p录像进行识别,30帧/秒是每秒需要1.4万亿次计算,60帧/秒则翻倍到2.8万亿次计算。
这样的计算量是相当庞大的。根据AMD的数据,使用Trinity APU A10-4600M为例的话,GPU计算耗时好的情况下只有CPU的1/8,差的情况下需要CPU的3倍左右。显然CPU和GPU单独完成这项任务似乎都有不太合适的地方,其原因主要是计算机只有通过特征点才能确定哪里是人脸,而《蒙娜丽莎》画面并非全部都是人脸,不同区域的计算需要不同类型的任务才能判定。
如果使用HSA来进行的话,AMD宣称HSA能够在不同的情况下使用CPU或者GPU来计算、或者同时使用二者来进行计算。在AMD的演示中,0段开始是由CPU处理,1~8由PU和GPU共同处理,而后的9~22则是GPU处理。终测试结果是HSA的效能是传统计算方法的2.5倍,每一帧的功耗也只有传统的1/2.5,换算下来能耗比约提升了6倍左右。
AMD为用户展示了HSA美好的未来—更高的速度和更优秀的能耗比。显然HSA在合适的任务上将会带来令人惊喜的性能表现。不过摆在AMD面前的困难还相当多。因为无是硬还是软件,习惯了传统计算的用户要突然接受HSA还存在很大的困难。
不过别忘了,还有HSA联盟。没错,HSA联盟中另一个巨头ARM对异构计算非常看好。在ARM之前对新的处理器技术的展示中,ARM希望自己的CortexA系列处理器可以和支持Open CL的Mali系列GPU组建异构计算系统,甚至在ARM的big.LITTLE架构中,Cortex-A7处理器和Cortex-A15处理器之间的切换也以看作是特殊的“异构计算”。目前的Cortex-A7和Cortex-A15处理器是一对一绑定的,ARM希望未来可以将其解绑,将不同的任务交给合适的核心进行处理,这样可以大幅度降低功耗并且更为智能。其余加入的厂商诸如三星、高通、德州仪器等,都是拥自己CPU、GPU架构的厂商,都希望在异构计算中获得一些优势。特别是异构计算有希望带来更为优秀的性能功耗比,更是吸引了注重移动处理器功耗和性能功耗比表现厂商的注意。
但是这所有的厂商加起来推广HSA,似乎还是有些不够。原应很简单,这些厂商依托的软件技术基础是Open CL,苹果作为Open CL的创始人和推广人,并没有出现在HSA联盟的名单上。在PC市场,占统治地位的是英特尔和微软,也没有成为HSA的座上宾。HSA吸引到的唯一堪称业界规则制定企业的场上只有ARM—移动计算市场现在看起来也不太需要如此强大的可编程处理器来执行异构计算,毕竟可编程设备要比固定功能设备需要更多的晶体管和功耗,这并非移动计算厂商的希望,如果将其引入桌面市场,ARM目前的实力还尤嫌不足。总的来说,在大部分业内软件和硬件规则的制定厂商都没有为HSA联盟摇旗呐喊,HSA联盟的成功可能性还存在一些让人担心的地方。
HSA可以成功吗?无法确定。这样一个开放的、新型的和有创新精神的业内联盟的成立的确是一件好事,但成功与否又是另外一件事情。HSA的未来,就像其需要执行的任务那样艰难— GPU和CPU两种架构的智能融合,并行和串行的鸿沟。HSA联盟,需要走的路还很长,很长。
AMD在异构计算的技术展示中,专门使用了很大的篇幅来介绍统一寻址内存对异构计算的意义。可能在很多人眼中,统一寻址内存甚至只是HSA系统中不太起眼的部分,但对于AMD的APU或者AMD推广的HSA来说,异构系统下的统一内存寻址(heterogeneous Uniform Memory Access,简称为hUMA)实际上是整个AMD HSA计划的核心所在。
有关GPU和CPU在目前PC架构中组建异构计算时存在的瓶颈等问题,正文有一定介绍,其核心问题就是PCI-E总线带来的传输瓶颈。除了核心问题外,其他的一些附加问题也存在并且很难以解决。
比较明显的是数据的访问问题。假定GPU和CPU中不存在数据传输瓶颈后,CPU如果需要访问GPU显存中的数据,首先需要做的是将访问的区域锁定起来(一般是整个显存),等待读写完成后再释放,如果这个时候恰好有数据在访问区域中读写,那么GPU需要等到CPU工作完成后再进行操作。这个过程效率相当低下。一些诸如CPU的启动指示器等关键性的功能,在GPU上又无法运作,因此整个数据访问呈现一种机械的、暴力的机制。
不仅如此,一般来说,当前以分离式内存寻址(GPU和CPU的显存或内存以独立方式存在)CPU和GPU组成的异构系统,GPU在计算前,会等待CPU将所有的数据从内存全部复制到GPU的显存中。反之,CPU如果需要GPU显存内的数据进行计算,需要将整个GPU显存内的数据全部复制到CPU内存中。因此CPU往往需要在内存中为GPU留下相同大小的区域用于更新数据。换句话来说,对CPU和GPU而言,对方的内存池是以一个整体来运作的,极为死板。
不过AMD想到了对策,这就是hUMA技术。在hUMA技术来临后,上述的问题将得到根本意义上的改善。
hUMA能够让GPU和CPU直接存储统一的数据而不改变系统正在进行的运作。hUMA存在双向一致性,所有的操作对对方来说都是可见的,不仅是内存,hUMA也能使用在CPU配置的虚拟存储(demandpagedvirtual memory)上,比如某资料存在于CPU的虚拟存储(实际上在硬盘中)但是GPU却需要,那么CPU就会告诉操作系统进行寻找并将其放入相关的区域供GPU使用。
GPU可以支持分页内存管理。分页内存管理是现代CPU使用的主要内存管理方式,但是GPU上依旧无法支持。hUMA实现了对GPU的分页内存管理,GPU被允许产生缺页异常,不会受限于传统的页表锁定内存。这项功能会让GPU的内存管理更为自由,更有效率。
hUMA支持系统整体内存空间的全局管理。AMD对此的解释是:CPU和GPU的进程可以从整个内存空间内动态分配内存。举例来说,比如有8GB的统一内存空间,CPU和GPU可以做到按需分配,如果CPU需要处理大数据量(比如CPU进行的数据转码),那么CPU会优先分配到更多的内存,GPU由于没有太多工作会及时释放空闲空间供CPU使用,仅维持低的显示需求即可。当GPU在处理图形任务繁重的内容时,又会自动占据更多的内存空间充做显存,CPU在此时一般不异常,不会受限于传统的页表锁定内存。这项功能会让GPU的内存管理更为自由,更有效率。hUMA支持系统整体内存空间的全局管理。AMD对此的解释是:CPU和GPU的进程可以从整个内存空间内动态分配内存。举例来说,比如有8GB的统一内存空间,CPU和GPU可以做到按需分配,如果CPU需要处理大数据量(比如CPU进行的数据转码),那么CPU会优先分配到更多的内存,GPU由于没有太多工作会及时释放空闲空间供CPU使用,仅维持低的显示需求即可。当GPU在处理图形任务繁重的内容时,又会自动占据更多的内存空间充做显存,CPU在此时一般不太会占据大量内存,会将容量释放出来供GPU使用。
hUMA被AMD作为HSA的核心功能之一,它从根本上解决了CPU和GPU长久以来的数据不统一问题。在hUMA的帮助下,GPU和CPU都可以实时获取数据更新,并且可以直接访问对方的虚拟内存,不会再受到物理内存的限制。在这种机制下,GPU和CPU就可以很高效地传递数据进行计算,异构计算中重要的按需分配任务的能力也能得到保障。如果没有hUMA,回到传统的内存状态的话,光是数据复制就需要耗费大量的时间,更不要说随时随地保持数据一致性了。hUMA在AMD HSA中,是整个异构计算的前置条件,如果没有hUMA,那么异构计算即使不会无法完成,在性能上也会暴跌。