认识多种处理芯片的特性和实战:下篇

更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent.com/developer

作者:高剑林

1.6 ASIC的架构

ASIC和FPGA类似,都是用门电路资源实现固定的算法,不同之处是FPGA是固定排列的门电路阵列,固定的排列方式决定了编程过程有大量的冗余电路没有充分利用,造成门电路资源的浪费,而ASIC是经过专门优化之后的门电路布局,相比较FPGA精简的多。根据厂商的提供的资料,实现同等功能FPGA所需的门电路数目可能比ASIC高10倍。

从使用方式来比较,FPGA可以重复编程,而ASIC一次编程后无法更改。由于FPGA可重复编程的灵活性,设计ASIC芯片多数时候会先用FPGA实现逻辑功能,然后基于FPGA的结果进行优化和整合,得到最终的ASIC芯片需要的电路设计。

在真正的实践中,并没有进行ASIC的设计和实际的制造,这是因为ASIC的设计和制造非常昂贵,和合作厂商沟通的结果大概需要百万美元的投入。ASIC芯片的昂贵决定了它不可能在小规模应用的场合出现,而必须是大规模(达到百万以上的量级)的应用场景才可以分摊ASIC的昂贵投入取得经济上的合理性。这种特性导致一个有趣的结果,一种计算算法初步启动时常常使用FPGA作为硬件载体,利用FPGA承载算法,随着规模扩张,就有商业性的ASIC芯片出现。一旦规模达到经济上的合理,ASIC芯片的成本就远小于FPGA的成本并取代FPGA的地位。

一个事实就是PCIE SSD的应用。早期的PCIE SSD都是使用FPGA作为内部算法的硬件载体,而2014年以来随着PCIE SSD应用的规模化,已经有ASIC芯片出现并在一些PCIE SSD的产品中应用。后续ASIC芯片很可能替代FPGA在PCIE SSD的应用。

1.7 计算实践和对比

为比较各种芯片的计算性能,以jpeg格式的图片进行解码和重新编码的计算为例子。下图展示了jpeg图像处理的算法过程。

jpeg图像的压缩过程:所有的图像数据首先要进行色彩空间的转换,从RGB色彩空间转换为YUV色彩空间。然后将图像分割为8像素X8像素的图像块,对每个图像块进行离散余弦变换(DCT),然后对变换后的数据量化得到量化值,最后对量化值进行墒编码,得到压缩后的图像数据。

而jpeg图像的解码过程则是编码过程的逆向过程,首先对压缩的图像数据进行墒解码,得到量化之后的数据,然后执行反量化获得量化之前、离散余弦变换之后的数据,最后进行反离散余弦变换,获得原始图像数据。

1.7.1 CPU的实践和性能

对比测试的项目以每秒钟jpeg图片解码然后重新编码的性能为准,对单张图片循环重复计算,单位为张数。CPU计算平台采用的处理器为至强E3-1270,CPU计算平台使用的转码软件是imagemagic-6.8.6,多进程并发循环执行。下表给出CPU的性能数据。

1.7.2 GPU的实践和性能

利用GPU进行图片解码和再编码时,首先遇到了顺序执行的问题。JPEG解码里面的墒解码器使用的是霍夫曼解码。霍夫曼解码在解码图像数据时候,依次处理一个个图像块,块之间没有分割标志,因此存在数据依赖关系,必须把前面图像块的数据解码完成,才能处理下一个图像块。这种必须顺序执行的计算部分GPU运行效率非常低,如果霍夫曼解码在GPU里面完成,整体效率甚至不如CPU。我们和Nvidia公司的软件团队讨论了这个问题,最后确定的方案是将霍夫曼解码部分由CPU完成。使用GPU的异构编程应当被看做是CPU的计算辅助单元,共同和CPU完成计算任务,由于架构和配套资源的特点,很难把GPU当作完整的解决方案。

第二个重要的问题是内存的分配和管理。以操作系统的角度来看,异构编程其实是对外部设备的编程,软件代码可以分成两部分,一部分在CPU上面执行,另一部分在GPU上执行。GPU的内存分配其实是对设备内存的分配,这种分配操作运行性能很低,严重影响整体计算的效率。在实际测试的代码中,将所有的设备内存分配都在开始时候一次完成,避免实际使用时的内存分配。数据从CPU内存复制到GPU的设备内存后,才能进行高性能计算。因此需要减少内存的复制时间,尽量使复制过程和GPU的计算叠加起来,形成流水式的操作。

使用GPU的异构编程,需要时刻关注GPU的利用率指标。这个指标代表GPU的繁忙程度,如果利用率很低,说明没有充分利用GPU内部的流处理器,存在流处理器较多时间空闲的情况,就需要调整和优化代码结构。一般说来,GPU的利用率应该大于80%,这是才比较充分的利用了GPU的性能。

最终的测试是和Nvidia公司的软件团队共同完成,实验性能得到了Nvdia公司的认同。下表给出GPU对JPEG图像再编码的性能数据。

1.7.3 FPGA的实践和性能

FPGA是一个单独的芯片,为了能在服务器环境使用FPGA芯片,需要设计一张FPGA计算卡,该卡使用PCIE接口和主机连接,卡上安装一片xilinx v7-690T的芯片,同时具有2GB的DDR内存。FPGA编程没有操作系统的支持和辅助,因此FPGA内部的资源必须用户自己管理,比如FPGA访问DDR内存的数据,必须通过硬件逻辑来实现,FPGA芯片和外部设备之间的数据交换也必须全部由使用者设计硬件逻辑实现功能,比如通过PCIE接口将主机内存复制到FPGA卡内的DDR内存等。

而且FPGA软件设计的生态环境和CPU的环境不同,通常FPGA设计没有大量可用的开源软件。即使有一些公司提供商业的解决方案,费用一般也很昂贵。实际上在硬件设计领域,一般都流行商业授权的模式。商业公司通常将开发的硬件逻辑打包为IP(intelligence property),有购买IP意向的使用者和商业公司谈判使用模式和费用,谈判完成前一般不提供试用版本。

为了解决FPGA编程困难、生产效率低的问题,我们创建了一个FPGA编程框架,利用框架提供用户需要的控制和数据,用户只需要聚焦于算法和功能,而不必关心底层功能的实现。FPGA编程框架弥补了FPGA 没有操作系统支持的弱点,其实质上类似一个小型的操作系统,实现对资源的管理和使用。如下图所示:

上图绿色部分展示了FPGA编程框架的构成,当前编程框架包含对PCIE接口协议的封装、DDR内存的存取和多路仲裁、DMA功能、邮箱消息接口等。编程框架里面包含了下列的重要部件:

PCI设备配置空间:设置PCIE设备配置空间的信息,包括PCI设备ID,制造厂商和设备IO端口以及IO mem资源

DMA:启动DMA功能,从主机内存物理地址复制数据到FPGA卡DDR内存的指定地址,或者从FPGA卡DDR内存的指定地址复制到主机内存物理地址。

DDR:从FPGA卡DDR内存指定地址读数据,每次读出64bit数据。或者往FPGA卡DDR内存指定地址写数据,每次写入64bit数据。

邮箱:邮箱提供主机和FPGA芯片之间的消息接口。

中断资源:中断接口管理和控制,通过接口可以触发一个系统中断。

在FPGA程序实现时最重要的问题就是资源利用率。FPGA和CPU不同,如果资源没有限制,FPGA理论上可以部署足够多的计算单元,性能可以达到无限。在图片转码的实践中,基于690T的芯片,实际上部署了30路的编解码核心,这时资源利用率达到70%。下表给出FPGA的性能数据。

1.8 结论和综述

从整个实践的过程理解,FPGA&GPU芯片的使用是很复杂的过程。性能和性价比是否具有优势需要针对业务的计算类型设计程序和优化,并进行实际的验证得出结论。希望简单和一致性的结论没有可能,而厂商的结论多半并不可信,和实际验证的数据差别巨大。现实是硬件、环境和算法资源都很缺乏,这可能是异构编程应用不广泛和困难的原因。脱离了CPU的支持,使用GPU&FPGA等芯片的异构编程困难太多,如果像CPU集成GPU一样,同样在CPU内部集成FPGA功能,方便用户的选择和使用,将大大推动各种场景的实际应用。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171228A081K600?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区