Altera的野望——OpenCL FPGA
去年11月Altera"悄悄的"发布了Altera面向FPGA的OpenCL计划,内容仅仅是一个网页和一份仅仅8页的白皮书,没有可以实现的工程。内容虽少,但是难掩Alter在可配置计算领域的野心。
OpenCL为何物?
OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。传统上,OpenCL应用于CPU、GPU等通用设备,在OpenCL 1.2中,提供了对其他设备的支持。
FPGA它极强的可配置性能在很多领域发挥作用。随着工艺的提高,FPGA的功能也越来越强大,可以在某些领域替代CPU、GPU的计算功能。但是传统的FPGA设计极为复杂,不仅设计思路同在CPU、GPU上设计软件完全不同,还需要大量的考虑如约束等非常细节的物理底层问题。因为传统FPGA设计不仅门槛很高,而且设计周期也远长于纯软件设计。
如果能把OpenCL标准引入到FPGA中,开发人员利用OpenCL能够自然的描述在 FPGA 中实现的并行算法,其抽象级要比VHDL或者Verilog等硬件描述语言(HDL)高得多。
OpenCL标准简介
OpenCL 应用程序含有两部分。OpenCL 主程序是纯软件例程,以标准C/C++编写,可以运行在任何类型的微处理器上。例如,这类处理器可以是FPGA中的嵌入式软核处理器、硬核ARM处理器或者外置x86处理器。如图所示。
在这一主软件例程执行期间的某一点,某一功能有可能需要很大的计算量,这就可以利用并行器件的高度并行加速功能,例如CPU、GPU、FPGA等器件。要加速的功能被称为OpenCL内核。采用标准 C编写这些内核。下图中的例子对两个数组a和b进行矢量加法,将结果写回输出数组中。矢量的每一元素都采用了并行线程,当采用像 FPGA这类具有大量精细粒度并行单元的器件进行加速时,能够很快的计算出结果。主程序使用标准OpenCL应用程序接口(API),支持将数据传送至FPGA,调用FPGA内核,传回得到的数据。
CPU与GPU的并行性来自于把并行线程在不同的内核中执行,而FPGA是把内核内核功能传送到专用深度流水线硬件电路中,使用流水线并行处理概念,而本质上就是多线程的。这些流水线的每一条都可以复制多次,与一条流水线相比,提供更强的并行处理功能。如图示,可以通过级联功能单元实现矢量加法内核,在 OpenCL描述中实现每一操作,进行复制以满足实际应用的吞吐量和延时要求。虽然所显示的只是一个简单表征,但每个功能单元都可以是深度流水线,以保证最终电路的工作频率足够高。此外,编译器可以建立电路来管理与外部系统的通信。