【交易技术前沿】OPENCL 开发FPGA应用的路径探索 / 邹经纬,马辉,钟浪辉,陈敏,陈坚,刘啸林

上交所技术服务2018-12-05 14:44:00


本文选自《交易技术前沿》总第三十期文章(2018年3月)

国泰君安股份有限公司 邹经纬、马辉
上交所技术有限责任公司 钟浪辉、陈敏、陈坚、刘啸林

近年来FPGA技术在证券期货市场得到广泛使用,证券期货业许多核心机构、会员单位都加大了对FPGA技术的研究与应用。上交所技术公司也积极布局研究FPGA技术,我们在去年研发《FAST行情硬解码》的基础上,今年新立项与国泰君安合作研究《FPGA实现股票期权相关指标》,希望探索纯软件工程师自主开发FPGA应用的路径,既利用FPGA应用运行稳定、运算高效、低功耗的特点,又达到公司完全掌控知识产权的要求。

1. FPGA与OPENCL概述

1.1 FPGA

FPGA(Field-Programmable Gate Array,现场可编程门阵列)介于专用芯片和通用芯片之间,具有一定的可编程性,可同时进行数据并行和任务并行计算,在处理特定应用时有更加明显的效率。更重要的是,FPGA具有明显的性能功耗比优势,其能耗比是CPU的10倍以上、GPU的3倍。
此外,可定制化也是FPGA的一大重要特性。正是因为具备极强的性能功耗比优势和定制化特点,FPGA在诸多领域得到应用,如逻辑控制,信号处理,图像处理等方面,最近更是在大数据处理、深度学习中的在线识别系统中开始尝试使用。
不过,传统FPGA开发采用Verilog、VHDL等硬件描述语言,对开发者要求较高,开发周期也较长,因此在高性能计算应用受到限制。而采用OpenCL,利用软件高级语言和模型编程,开发周期可大幅缩短,对于一些应用可以实现几个人月完成,为FPGA的应用发展提供了更为广阔的平台。

1.2 OPENCL

OpenCL 标准是首个开放式、免费许可的统一编程模型,能够在异构系统上加快算法速度。OpenCL 支持在不同的平台上使用基于 C 语言的编程语言开发代码,例如 CPU、GPU 及 FPGA。OpenCL 的主要优势在于它是一个可移植、开放式、免费许可的标准,这是它与专用编程模型相比的一个关键优势。
对于软件工程师而言,OpenCL 是一个编程模型,而对于系统架构师来说则是一种方法。它基于支持扩展的标准 ANSI C (C99)来隐藏并行性。此外,OpenCL 还包括一个应用编程接口 (API),支持主机与硬件加速器进行通信(一般通过 PCI Express),或内核之间通信,而无需主机交互。

2.面向OPENCL的FPGA解决方案-赛灵思(Xilinx)的SDAccel

赛灵思是 All Programmable 器件、SoC 和 3D IC 的全球领先供应商。赛灵思公司行业领先的产品与新一代设计环境以及 IP 核完美地整合在一起,可满足客户对可编程逻辑乃至可编程系统集成的广泛需求。
SDAccel 是赛灵思公司面向系统和软件工程师的一系列开发环境,让具备较少甚至没有 FPGA 专业知识的开发人员也能够利用高级编程语言充分发挥可编程硬件和业界标准处理器的功能优势。
2014国际超算大会 (Super Computing 2014) 上宣布推出针对 OpenCL™、C 和 C$++$的S DAccelTM开发环境,将单位功耗性能提高达25倍,从而利用 FPGA 实现数据中心应用加速。SDAccel将业界支持 OpenCL、C 和 C$++$内核任意组合的架构优化编译器、库、开发板完美结合在一起,在 FPGA 上首次实现了完全类似 CPU/GPU 的开发和运行时间体验。

2.1 编译器架构面向 OpenCL、C 和 C++进行了优化

• 结构优化的编译器,较之 CPU/GPU 可将数据中心单位功耗性能提升高达 25 倍。
• 较之其他 FPGA 解决方案,实现了 3 倍性能和资源效能
• 实现全新或已有的 OpenCL, C 和 C$++$代码,加速高性能加速器
软件开发人员充分利用SDAccel编译器的功能,能够利用新的或现有的 OpenCL、C 和 C$++$代码创建高性能加速器,并针对计算搜索、图像识别、机器学习、编码转换、存储压缩和加密等各种数据中心应用中的存储器、数据流和流水线技术进行了精心优化。

2.2可在 FPGA 上实现类似 CPU 的开发体验

SDAccel 是首个面向 OpenCL、C 和 C$++$进行架构优化的编译器,并结合了#库、开发板,可在FPGA上实现类似 CPU/GPU 的开发运行体验 。
• 首款面向 FPGA 平台的完整的软件开发环境
• 即便没有 FPGA 使用经验,也能优化 FPGA 平台的应用。
• 轻松将应用移植到 FPGA 上,同时还可维护和重复用 OpenCL、C 和 C$++$代码。
借助 SDAccel,开发人员能够使用其熟悉的工作流程优化应用,而且即便之前没有 FPGA 使用经验,也能受益于 FPGA 平台的优势。集成设计环境 (IDE) 不仅可提供编码模板和软件库,而且还能对各种开发目标进行编译、调试和特性分析,如在 X86平台上仿真、使用快速仿真进行性能验证以及在 FPGA 处理器上进行本地执行等。IDE 可在数据中心用 FPGA 平台上执行应用。该平台配套提供面向所有支持开发目标的自动仪器插入功能。此外,SDAccel 还经过精心设计,使 CPU/GPU 开发人员能够轻松将其应用迁移到 FPGA 上,同时还可在他们熟悉的工作流程中维护和复用 OpenCL、C 和 C$++$代码。
综合全面的 SDAccel 环境包括编程器用 IDE、基于C语言的 FPGA 优化库,以及数据中心用现成商用 (COTS) 平台。
SDAccel库包括用于高性能低功耗实现方案的内置 OpenCL 函数、DSP、视频以及线性代数库。针对特定领域加速,赛灵思联盟合作成员 Auviz Systems 提供了精心优化的 OpenCV 和 BLAS OpenCL 兼容型软件库。 COTS 成员还有 Alpha Data、Convey、Pico Computing等。

2.3 可在 FPGA 上实现类似 CPU 的运行体验

• 使用多程序和类似 CPU/GPU 的可加载计算单元,支持大型应用
• 程序转移时维护系统功能,同时还能在执行应用时保持关键的系统接口和功能继续发挥作用。
• 实现全新或已有的 OpenCL, C 和 C$++$代码,加速高性能加速器

图1 SDAccel开发FPGA应用的环境

SDAccel 能够支持带有多个程序和类似 CPU/GPU 按需可加载计算单元的应用。与 CPU/GPU 类似,SDAccel 对于 FPGA 解决方案的独特之处,在于能够保持程序转换过程中的系统正常工作。SDAccel 是业界唯一能够创建可在应用运行过程中加载新加速器内核的 FPGA 计算单元的环境。 在整个应用执行过程中,存储器、以太网、PCIe®和性能监控器等关键系统接口和功能均保持工作状态。即时可重配置的计算单元可 让多个应用共享 FPGA 加速器。例如通过对运行系统编程,可支持图像搜索、视频转码和图像处理之间的切换。

3. 面向OPENCL的FPGA解决方案-英特尔(Intel)FPGA SDK

面向 OpenCL™ 的英特尔(Intel) FPGA SDK 是一个一流的开发环境,支持软件开发人员提升其应用程序在使用英特尔 CPU 和 FPGA 构建的异构平台上的运行速度。该环境将英特尔的先进软件开发框架和编译器技术与新的革命性英特尔 Quartus® Prime 软件相结合,提供了新一代开发环境,在隐藏 FPGA 细节的同时实现了工作优化。面向 OpenCL 的英特尔 FPGA SDK 支持您充分利用 FPGA 的独特功能提升性能,实现高能效和低延迟。
面向 OpenCL 的英特尔 FPGA SDK 提供了一个厂商扩展、一个 I/O 及一个主机通道 API,能够通过数据流 I/O 接口(例如 10 Gb 以太网)直接将数据传输至内核。

3.1 Intel FPGA SDK的主要特性

• Microsoft* Visual Studio 或基于 Eclipse 的面向 OpenCL API 的英特尔代码构建工具(现在支持 FPGA)
• 采用英特尔编译器技术的快速 FPGA 模拟
• 创建 OpenCL 项目快速启动向导
• 语法突显和代码自动完成特性
• 假设内核性能分析
• 快速静态 FPGA 资源和性能分析
• 支持快速和增量 FPGA 编译

3.2 Intel FPGA SDK开发OpenCL的示例

3.2.1 Intel OPENCL SDK的安装

从Intel FPGA网站下载安装包:Intel FPGA SDK for OpenCL。根据选择的版本类型和版本号不同,下载的安装包文件可能不一样。以Intel PAC对应的Pro 17.1为例,进行安装说明。下载的安装包为AOCL-pro-CB-17.1.0.240-linux.tar,同时找Intel相关人员申请软件使用的License。
环境要求:
硬件:内存24GB RAM以上,磁盘85GB空闲以上。因为安装包本身就是20~30GB。
软件:Linux操作系统,安装gcc,perl。
将AOCL-pro-CB-17.1.0.240-linux.tar拷贝到用户目录下。切换到root权限。解压:
tar -xvf AOCL-pro-CB-17.1.0.240-linux.tar
运行安装程序:
./setup_pro.sh
如果系统有图形界面,没有图形界面,则一直输入Enter:
图形界面下选择next,然后设置安装目录,默认为/root/intelFPGA_pro/17.1。可以自行设置。
选择需要支持的FPGA型号。Intel PAC是A10芯片,因此选择Arrial 10的部分。

图2 安装时选择Arrial10

安装结束后会提示是否安装Intel 的CodeBuilder,编写OpenCL的工具,可选。
完成安装后,进入IntelFPGA SDK的安装目录,默认是在~/intelFPGA_pro/17.1/hld
cd ~/intelFPGA_pro/17.1/hld
运行脚本,检查环境变量
source ./init_opencl.sh
设置license路径的环境变量:
export LM_LICENSE_FILE=/root/4ccc6af076ff_License.dat
建议将如下脚本添加到~/.bashrc最后,添加环境变量,或者手动设置。

安装FPGA板卡驱动,默认安装a10gx,也可以指定其他FPGA型号。
aocl install
选择Y,继续。

3.2.2 实例的开发、编译、调试与运行

以官网的矢量加为例,下载官网上的代码。可以使用visual studio、sublime text或是其他软件开发工具进行OpenCL的代码开发。
编译
编译分为两种,一种是模拟编译,一种是正常编译。前者是用于纯软件调试,运行于纯CPU上,无需FPGA,对应的描述是emulator,采用类似于调试c/C$++$语言的方式调试OpenCL代码。后者是编译出aocx文件(用于加载到FPGA上运行的bitstream),在运行时,加载到FPGA上,不能使用普通的gdb进行调试,需要专用的FPGA调试工具JTAG或是其他工具进行调试。
一般情况下,在开发FPGA OpenCL代码时,先进行模拟编译,调试通过之后再上板运行,进行测试。
编译仿真的aocx:
aoc -march=emulator device/vector_add.cl -o bin/vector_add.aocx –board a10gx
编译正常的FPGA使用的aocx(耗时几个小时):
aoc device/vector_add.cl -o bin/vector_add.aocx –board a10gx
编译主机程序:
make
调试
调试kernel代码。在Linux上,使用gdb调试主机程序(host代码)和设备程序(FPGA的OpenCL),调试时,加上临时环境变量CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=1,执行主机程序,这样主机程序不会将aocx烧入FPGA,而是选择仿真emulator进行调试。仿真的aocx类似于Linux上的so动态链接库。

使用gdb调试程序:
CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=1 gdb bin/host
主机代码就是c或cpp代码,调试方式相同,但是kernel代码调试有些区别,因为没有源代码,需要在kernel函数名打断点:如果出现未定义提示,选择Y继续,进入kernel代码中,可以打印查看变量信息,与调试c/C$++$函数相同。
运行
运行仿真程序,默认执行1000000个浮点矢量加
CL_CONTEXT_EMULATOR_DEVICE_INTELFPGA=1 bin/host

图3 仿真运行

运行正常程序,就无法使用gdb调试FPGA程序,必须使用专业的FPGA调试工具。上板运行就是不加仿真环境变量,直接运行主机程序。
bin/host

4.开发FPGA应用的路径探索

本文主要分享了我们通过Intel FPGA SDK 、OPENCL开发FPGA应用的一些心得。后续我们将在此基础上开展期权定价等相关指标的开发,希望可以得到优于CPU计算的性能,进而获得期权做市商等业务专家的认可。未来,越来越多的C/C++等纯软件类工程师可以拓展新开发领域,利用Xilinx、Intel等公司提供的OPENCL解决方案开发各自需要的FPGA应用。


 
免责声明


本公众号内容仅供参考。对任何因直接或间接使用本公众号内容而造成的损失,包括但不限于因有关内容不准确、不完整而导致的损失,本公众号不承担任何法律责任。如有问题请反馈至tech_support@sse.com.cn。

-------------------------- 上海证券交易所为证券公司、基金管理公司等市场参与者及相关行业机构提供交易技术支持与服务,包括日常交易技术支持、技术交流研讨、市场调查反馈、证券信息技术知识库、测试等服务。

点击"阅读全文"了解详情

Copyright © 古田计算器虚拟社区@2017