转帖:采用高级语言开发FPGA的探索
近年来,由于人工智能和金融数据分析等计算密集型领域的日益兴起,异构计算越来越受到大家的重视。异构计算是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式,目前主流的异构并行计算平台是X86+GPU(Graphics Processing Unit,图形处理器)和X86+FPGA(Field-Programmable Gate Array,现场可编程门阵列)。本文主要探索CPU协同FPGA的异构计算方式。 传统的FPGA开发方式是采用硬件描述语言Verilog/VHDL,开发难度高,为了在FPGA上实现类似CPU/GPU的开发运行体验, FPGA两大厂商Xilinx和Altera分别推出了各自的面向高级语言进行架构优化的编译器SDAccel和Altera SDK。本文中课题是在Xilinx的官方合作厂商Nimbix提供的云SDAccel环境下采用OpenCL(Open Computing Language,开放计算语言)开发实现的。
本课题是在FPGA上采用OpenCL实现二叉树期权定价算法。 实现框架如下: 实验过程中发现,虽然OpenCL支持double pown(double,int),但是该函数在FPGA上计算结果与CPU上的计算结果有误差,当步数STEP=512时,FPGA的期权定价结果仅能与CPU计算结果保持三位有效数字的精度。因此,本次实验中二叉树的第STEP步的所有节点期货价格计算由CPU和FPGA共同完成。 开发环境如下:
本次课题验证了二叉树期权定价算法中步数分别为32,64,128,256,512和1024时,CPU计算结果和FPGA软件仿真计算结果相同。由于硬件仿真和板级测试耗时很长,只验证步数为32,期货价格为406.3,期权执行价格为330,波动率为0.3705583,剩余到期日为22,利率为0.0531时,单个期权在FPGA上的计算结果为76.176249。 实验过程中发现,基于FPGA采用高级语言开发有如下优点: 1) Xilinx提供OpenCL开发库,调用简单; 2) 运行在FPGA上的Kernel函数,支持OpenCL开发,也支持C/C++开发,对于软件开发人员而言,学习成本很低; 3) SDAccel支持gdb调试,支持printf()打印调试(仅适用于基于OpenCL的kernel函数); 4) 将工作组大小设置为reqd_work_group_size(1, 1, 1),编写OpenCL kernel有C/C++的体验,可直接应用Xilinx提供的优化措施对kernel进行性能优化; 5) SDAccel的优势在于,屏蔽硬件底层驱动,让开发人员在FPGA上获得软件开发的体验,这也是SDAccel与Vivado HLS最大的区别,因为运行在FPGA上的kernel函数还是通过Vivado HLS进行编译的。 本文仅验证了采用高级语言开发FPGA的可行性,还有很多优化工作待完善,仅以此文为大家提供一个新的视角,为软件开发人员利用FPGA进行算法加速做前期调研,欢迎感兴趣的同事共同交流。
|