关于摩尔定律:
摩尔定律1965年提出,晶体管密度是按照每年翻倍发展的,之后的趋势也是这样——每一代芯片的的时钟频率提高50%,而同时工艺节点减小了0.3,功耗密度翻倍(保持功耗相同的情况下,面积0.7*0.7=0.49,因此提高频率使得性能提升了);而在2000年中期之后,出现了物理尺寸更小的器件,意味着,我们没有办法保持功耗密度不变,而同时提高频率,结果我们看到自此之后,时钟频率并没有显著提高,需要通过并行来提高性能,所以多核CPU流行起来。即使是最基本的处理器,超标量和无序指令执行等高级体系结构都成为基本配置,软件和其他开发工具也都应用于开发同构和分布式系统。
异构计算:
需要提高程序执行性能,只是通过并行是不够的,因为不同的应用软件的行为是不同的:
(1)有大量控制代码的程序,如搜索、parsing(解析),适合运行在超标量CPU上,支持分支预测机制;
(2)图像处理等需要大量数据处理的程序,适合高速运行在矢量体系结构上(典型的代表就是GPU,DSP)
(3)还有一类需要大量计算的应用,最适合在针对应用进行优化的硬件上执行,比如FPGA/ASIC。
因此,没有一种硬件体系结构可以做所有的事情,而功能最强大的系统会应用到多种硬件,以利用CPU/GPU/DSP/FPGA等不同组件的优势——这就是异构计算。程序员不仅仅是写一段代码丢给编译器执行就行了,还需要对执行硬件有所了解,在异构环境中开发的难度往往比较大。
传统的异构开发人员,为CPU和DSP编写顺序执行软件,一般来说像C语言这样的代码;而为FPGA编写底层硬件语言,如verilog或者VHDL,实现细粒度的并行和矢量功能。这样的开发往往比较低效。现在GPU上的开发有CUDA这样优秀的编程接口,充分发挥GPU数据并行的优势,但是只能在NVIDIA的GPU上运行。于是,需要有一种标准的异构编程模型,来完成跨平台的并行编程任务。
OpenCL就可以完成这样的任务,用同一的编程语言实现异构平台编程。本笔记重点关注OpenCL在CPU+FPGA的异构编程环境中的使用,因为随着FPGA的发展,我个人认为这将成为一种趋势。但是实际上,因为opencl是跨平台的,所以其他硬件环境也是类似的。
OpenCL初印象
(以下的图来自于[2])
OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。
OpenCL 应用程序含有两部分(host和kernel)。OpenCL 主程序是纯软件例程,以标准C/C++编写,可以运行在任何类型的微处理器上。例如,这类处理器可以是FPGA中的嵌入式软核处理器、硬核ARM处理器或者外置x86处理器。如图所示。在这一主软件例程执行期间的某一点,某一功能有可能需要很大的计算量,这就可以利用并行器件的高度并行加速功能,例如CPU、GPU、FPGA等器件。要加速的功能被称为OpenCL内核。采用标准 C(C99)编写这些内核。
下图中的例子对两个数组a和b进行矢量加法,将结果写回输出数组中。矢量的每一元素都采用了并行线程,当采用像 FPGA这类具有大量精细粒度并行单元的器件进行加速时,能够很快的计算出结果。主程序使用标准OpenCL应用程序接口(API),支持将数据传送至FPGA,调用FPGA内核,传回得到的数据。
对CPU和GPU来说,并行线程可以在不同的内核中执行,而FPGA能够提供不同的策略。可以把内核功能传送到专用深度流水线硬件电路中,它使用了流水线并行处理概念,在本质上就是多线程的。这些流水线的每一条都可以复制多次,与一条流水线相比,提供更强的并行处理功能。如图5所示,可以通过级联功能单元实现矢量加法内核,在OpenCL描述中实现每一操作,进行复制以满足实际应用的吞吐量和延时要求。
虽然所显示的只是一个简单表征,但每个功能单元都可以是深度流水线,以保证最终电路的工作频率足够高。此外,编译器可以建立电路来管理与外部系统的通信。在这个例子中,DDRx控制器和PHY连接至内核,使其能够高效访问片外阵列。类似的,PCIe IP自动例化,连接至内核,这样,x86主机能够通过OpenCLAPI与FPGA加速器进行通信。
在FPGA上实现OpenCL标准的优势:
采用FPGA可以对算法进行深度定制,就像在一块白板上设计。传统的底层语言设计需要工程师对资源、面积、频率、流水、并行这些问题做适当的均衡,因此需要很丰富的经验才能设计很棒的程序;而OpenCL试图来降低这一开发门坎。如下图,采用和软件开发一样的思路来开发。
这一方法可以与传统基于FPGA的设计方法相比。这里,设计人员的主要工作是对硬件按照每个周期进行描述,用于实现其算法。传统流程涉及到建立数据通路,如下图所示,通过状态机来控制这些数据通路,使用系统级工具(例如,SOPCBuilder、PlatformStudio)连接至底层IP内核,由于必须要满足外部接口带来的约束,因此,需要处理时序收敛问题。OpenCL编译器的目的是帮助设计人员自动完成所有这些步骤,使他们能够集中精力定义算法,而不是重点关注乏味的硬件设计。以这种方式进行设计,设计人员很容易移植到新FPGA,性能更好,功能更强,这是因为OpenCL编译器将相同的高级描述转换为流水线,从而发挥了FPGA器件的优势。
案例:MonteCarloBlack-Scholes方法
在金融市场上最重要的一个基准测试方法是通过Monte Carlo Black-Scholes方法计算期权价格。该方法基于对底层股票价格的随机仿真,以及数百万不同路径上的平均预期收益。图8以图形化的方式显示了这类仿真的一个例子。
图9显示了进行这一计算的高级算法结构。首先采用Mersenne旋转随机数发生器来创建均匀分布的数值。将随机数序列送入逆正态累积密度函数,以产生正态分布序列。然后,使用几何布朗运动,这些随机数用于仿真股票价格的变化。在每一仿真通路的最后,记录看涨期权的收益,进行平均来产生收益预期值。整个算法通过大约300行的OpenCL代码来实现,可以从FPGA移植到CPU、GPU。
利用针对Altera FPGA开发的OpenCL工作台,可以产生很好的基准测试结果,如表1所示。与相应的GPU相比,面向Stratix IV FPGA EP4SGX530的OpenCL工作台在吞吐量上超过了CPU和GPU。与相应的GPU相比,在执行相同的代码时,FPGA解决方案不但提高了吞吐量,保守估计,功耗也只有其五分之一。速率和高功效相结合,降低了大计算量应用的功耗需求。
(这个数据有点老了,现在的FPGA和GPU在浮点处理峰值上都远远大于表中数据,GPU的浮点运算性能绝对是超过FPGA的,因为但就是为这个而设计,但是实际算法还受很多其他因素影响。实际算法的性能就不一定了。另外在功率上FPGA目前还是有一定的优势的。)
结论
利用FPGA上的OpenCL标准,与目前的硬件体系结构(CPU、GPU,等)相比,能够大幅度提高性能,同时降低了功耗。此外,与使用Verilog或者VHDL等底层硬件描述语言(HDL)的传统FPGA开发方法相比,使用OpenCL标准、基于FPGA的混合系统(CPU+FPGA)具有明显的产品及时面市优势。
参考资料:
[1]支持opencl的设备,https://www.khronos.org/conformance/adopters/conformant-products#opencl
[2]http://articles.csdn.net/AMDyigoukaifajulebu/ziyuanxiazaiyemian_gongju/2012/0906/2809633.html
[3]ALTERA opencl官网,https://www.altera.com.cn/products/design-software/embedded-software-developers/opencl/overview.html