从某种角度上说,FPGA内部其实并没有所谓的“计算”,最终结果几乎是“电路直给”,因此执行效率就大幅提高。当然,由于采用的是通用的门电路组合,在某些处理效率上FPGA仍然不及ASIC极致,但是可重复更新内部逻辑的灵活性,再加上在固定算法上远高于CPU的执行效率,让FPGA在应用领域迅速得到重视。然而需要指出的是,用FPGA的门电路实现整数运算逻辑,要比实现浮点运算逻辑简单得多,所以FPGA的加速优势也更多的体现在整数性运算,而整数运算正是当前主流企业级应用的主要运算方式,而这也是为什么GPGPU更多的用于浮点运算领域(如HPC),FPGA更多用于整数加速领域的一大原因。

 

赛灵思总结的,目前FPGA相对于主流的x86处理器,在某些领域里的加速比,以及目前数据中心里可用到FPGA加速的领域,可以说80-90%的大规模并行密集应用都可以被FPGA加速,尤其是以整数型运算为主的应用,加速效果更为明显。当然,并不是说FPGA不能用于浮点运算,但相对来说,整数型加速对于FPGA更容易实现,相较GPGPU也有更明显的优势。另外,请注意很多IT基础设施的底层信息处理方面,如安全、加密、网络加速、键值存储也在FPGA的应用范畴之内,其“实用性”显然比GPGPU更为广泛。
但是,传统的FPGA加速设计,均是以I/O总线与CPU平台相连,比如常见的PCIe,在系统内部以一个I/O设备存在,所以在实际的应用中,对于应用开发者本身来说仍然有较大的难度。这次CAPI的出现,则从根本上解决了这个难题,从而让FPGA的加速优势得以获得更充分的发挥。

 

OpenPOWER CAPI简介
OpenPOWER所推广的技术就是基于IBM POWER8及以后的处理器与平台技术,这其中POWER8处理器所具备的一致性加速处理器接口(CAPI,CoherentAccelerator Processor Interface)就是一个重要的技术点,也正是它让FPGA迅速成为了新一代异构计算的亮点。

CAPI的基本原理就是通过在POWER处理器(从POWER8开始)内部设置一致性加速处理器代理(CAPP,Coherent Accelerator Processor Proxy),而在外置的加速卡上,则内置POWER处理器服务层(PSL,POWER Service Layer),其与CAPP配合,为加速卡在CPU上打通了一个“后门”。加速卡(PSL)与CPU(CAPP)之间采用成熟的PCIe总线+CAPI协议进行数据传输,但不用走复杂的PCIe I/O模式,并获得了与CPU对等访问虚拟内存地址的能力。目前POWER8内部共有两个CAPP,每个CPU可外接两个CAPI加速卡。
CAPI最为关键的重点就在于一致性(Coherent),确切的说它包含两个概念,它们之间是相辅相成的。第一个就是虚拟地址空间访问的一致性,这与传统的总线地址或物理地址访问的模式有了本质的区别。虚拟地址空间访问的一致性,是CAPI加速器实现与CPU对等访问的根本体现,否则在应用编程上仍然要有较大的调整。

 

在具体的FPGA加速应用中,应用透过CAPP与PSL的连接,挂载(绑定)加速卡,PSL与CAPP一起协同,让FPGA里的加速功能单元(AFU,Accelerator Functional Unit)实现与CPU的对等访问——可直接看到应用所指向的虚拟内存地址,并通过PCIe总线与应用沟通。

在CAPI+FPGA的应用中,用户先将相关应用的加速算法,以HDL(目前主要是VerilogHDL和VHDL)写入FPGA,构成加速功能单元(AFU),它就是上文提到的那个“外挂的特殊CPU核心”。然后再通过PSL与CAPP的协同,将AFU“嵌入”到CPU里,被应用发现并直接调用。AFU可以直接读写应用所管理的虚拟内存空间,以一种嵌入式的外挂处理模式实现应用的加速。从某种意义上说,“外挂”的AFU的作用有点像CPU的加速指令集(比如SSE、MMX等),但可灵活变换且效率明显更高。

在非CAPI加速体系中,传统的加速卡是以一个I/O设备存在的,这必然需要虚拟地址的重新影射,从而在内存中会生成3个数据副本,并需要大量的驱动访问指令,后果就是延迟的增加。

在CAPI体系下,CAPI加速器与CPU实现了对等访问,共享虚拟地址,数据无需转手,直接在加速器与应用之间进行沟通。在实际使用时也很简单,CAPI加速卡可以安装在任何提供PCIe3.0接口的OpenPOWERLinux服务器上。应用软件只需要调用一个CAPI函数,即可直接利用CAPI加速,而在对Linux更新驱动后,即可直接调用原有IM/GM等兼容接口函数。

由于CAPI接口并非传统意义上的I/O驱动模式,直接走硬件代理与CPU沟通,所以从应用的全局视角,数据的访问步骤明显减少(FPGA与CPU对等访问),让数据访问效率大幅度提高,总延迟约是传统模式的1/36,同时这种应用加速设计,对于应用的编程修改影响最小。

CAPI加速器从准备加速到完成加速的沟通流程相当的简洁明了,可以基本总结为——应用:CAPI加速器,我看到你了;CAPI加速器:应用,我已经为你准备好了;应用:我要处理的数据在内存地址AddrX处,剩下的工作就交给你了;CAPI加速器:好的,没问题;(开始循环加速)……CAPI加速器:报告应用,已经处理完毕;应用:好的,你先休息吧,有事我再叫你。

从以上图片可以看出,由于一致性特色的加入,让CAPI加速卡避开了传统I/O设备的驱动模式,直接以“硬件代理”的方式嵌入应用的执行,因此在总体的命令开销方面有明显的减少。这直接带来的效果就是延迟大幅降低——总延迟约只有传统加速模式的1/36,并且带来了更大的好处——由于没有了传统I/O设备层,应用平台为了适配加速器的编程修改非常小,应用开发者完全可以将应用做成自适应模式,在非CAPI平台上采用传统的处理模式,当发现系统有CAPI加速器则自动打开CAPI模式,这显然非常有利于CPAI加速模式在相关应用领域里的普及。

在具体的应用环境中,目前CAPI还不能用于虚拟化平台(比如KVM),但完全支持基于Linux核心的Docker容器平台(现在的CAPI全面支持Ubuntu 14.10)。按照IBM未来的发展规划,新一代CAPI正在路上,它将基于PCIe4.0规格(也可能会采用新的总线接口),并稍加改动,连接带宽较PCIe4.0稍微提高,以抵销CAPI协议的开销,从而让加速器可以充分利用到PCIe的带宽。另外,CAPI的虚拟化(多个应用可以分时复用加速器)也将是必然的,融入云计算平台的统一管理也将水到渠成。并且单一PSL未来可以挂载多个AFU,在FPGA内部最多可以同时具备4个AFU,PSL分别为它们保存各自的虚拟空间地址,并与CAPI一起保持缓存一致性,这就相当于给系统同时配备了4个外挂核心。在操作系统方面,未来还将支持AIX、RedHat等OS,这将意味着除了PowerLinux平台,传统的AIX POWER服务器上的应用也将能享受到CAPI加速。