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倍左右。