本帖最后由 lvroubaozi 于 2018-11-21 14:53 编辑
对于FPGA来说,我们最困惑的事无疑是开发调试过程的复杂,硬件逻辑语言让我们能够从底层对FPGA进行精细的设计,可以精确到一个逻辑门的时序,这让我们能够对我们的程序进行严格的时序控制。但副作用就是对于复杂的功能来说,我们不得不花大量的时间去进行开发调试。而且程序的更新迭代也更为复杂。Intel提供的Intel FPGA OpenCL SDK包让我们可以换一个思路去对FPGA进行开发,基于OpenCL SDK包我们可以使用C语言对FPGA进行开发,这样就大大加快了我们的开发过程。 我们先来看看什么是OpenCL?OpenCL(OpenComputing Language,开放计算语言)是一个为异构平台编写程序的框架, OpenCL由一门用于编写kernels(在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分区和数据分区的并行计算机制。OpenCL类似于另外两个开放的工业标准OpenGL和OpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL扩充了GPU图形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。 由此可见OpenCL是现在已经存在并很成熟的一套框架,再来看看Intel 的FPGAOpenCL SDK包。 面向 OpenCL 的Intel FPGA SDK 是一个开发环境,支持软件开发人员提升其应用程序在使用英特尔 CPU 和 FPGA 构建的异构平台上的运行速度。该环境将英特尔的先进软件开发框架和编译器技术与新的革命性英特尔 Quartus Prime 软件相结合,提供了新一代开发环境,在隐藏 FPGA 细节的同时实现了工作优化。面向 OpenCL 的Intel FPGA SDK 支持您充分利用 FPGA 的独特功能提升性能,实现高能效和低延迟。 开发模型如图 1所示,当开发者在开发程序时,主机端的程序除了和内核交互的API以外,其他的代码和其他OpenCL程序时完全一样的,包括开发环境以及编译工具。内核程序会在一个cl文件中,与常规的OpenCL C程序也区别不大,只要遵循一定的优化规则就可以。在编译内核过程中,产生一个aocx文件,在程序运行时,会从这个文件提取FPGA烧写文件,然后对fpga进行加载。整个过程并不需要对FPGA很了解也可以进行设计。这无疑降低了开发难度。
图 1面向OpenCL的Intel FPGA SDK 模型 当然对于这种开发方式来说,目前还是基于带PCIE接口的FPGA板卡才可以。对于这个板卡,大家既可以采用Intel 推出的PAC卡,也可以开发自己的板卡。不论何种卡片,最终FPGA内部逻辑会如图2所示,包括PCIE控制器、DDR控制器、以及中间的kernel区域,留给主机加载kernel代码用。
图 2 Intel OpenCL BSP 最终的OenCL平台的结构会如图 3所示,左边紫色部分就是主机端的程序,右边灰色部分就是FPGA的部分。FPGA中需要在一个固定区域包含与主机以及存储设备通信的所有逻辑,比如存储器接口,DMA控制器,pcie接口逻辑等。
图 3 Intel OpenCL平台结构图 到这里大家可以看出,FPGA在这套系统中的作用其实类似于GPU的作用,当我们上位机有一些需要大量复杂运算任务时,可以把这个任务交给FPGA去处理,处理完以后,再把结果交给上位机。这样就可以发挥FPGA的并行计算能力,极大的提高系统的计算能力,而且还可以直接利用C语言进行开发,加快开发过程。
|