自1985年首款FPGA诞生以来,FPGA已经是一名在电子信息领域征战了30年的老兵,这名战功赫赫的老兵如今已经正式开赴了一个新的战场。在2011年Altera公司发布支持利用OpenCL来开发FPGA的SDK工具以后,采用CPU+FPGA构成异构计算系统成为高性能计算领域一种非常具有竞争力的解决方案。为了让更多网友了解FPGA异构计算系统的原理、架构和开发流程,kaiyun官方注册特别邀请了电子科技大学黄乐天博士和电子科技大学“成电杰出学生” 蒲宇亮在电子技术应用·云课堂进行了一场公益演讲。
在演讲过程中,很多网友提出了自己在学习CPU+FPGA异构计算中遇到的问题,授课讲师黄乐天、蒲宇亮进行了详细的解答。
黄乐天
电子科技大学讲师、博士,《FPGA异构计算》一书的第一作者。
kaiyun官方注册著名专家博主:老莫(http://blog.chinaaet.com/molf)
主要研究方向为:多处理器片上系统与片上网络;高能效并行计算系统;基于FPGA的新型异构计算系统设计与实现。
蒲宇亮
电子科技大学“成电杰出学生”,中兴通讯公司工程师。
研究生期就读于电子科技大学--Altera联合实验室,主要研究方向为基于FPGA的新型异构计算系统,是《FPGA异构计算》一书的主要作者之一。2016年7月以 “蓝剑”精英人才计划(该计划全国仅招50人)身份入职中兴通讯。
我们两个平台都有使用过。SoC版本使用的是友晶公司提供的DE1-SoC开发板,基于PCIe的版本使用的是友晶公司提供的DE5-net,这二者在开发方法上并无本质区别,只是在开发流程和BSP支持上稍有不同。友晶公司的技术人员提供了很好的支持。
两者都可以,SoC资源较少,采用串口传输数据。若是对计算时间有严格要求则需采用PCIe传输的FPGA进行实现。
问题:FPGA异构计算目前在中国主要应用在那些领域?异构计算能够给这些领域带来那些新变化?
FPGA异构计算在中国目前还处于“试用阶段”,有部分公司(因为他们没有公开报道也不太好直接点名)在预研或者实验阶段尝试在使用这一计算模式。但基于GPU的传统异构计算已经在并行计算领域得到了较大规模的应用,如超级计算机、高性能服务器以及某些专用仿真设备。
基于OpenCL的FPGA异构计算比较适合用在算法中存在大规模并行计算特性的系统中,类似传统的GPU并行系统,相比GPU系统能够带来更低的功耗和更好的计算能效,能降低运维成本。
问题:多核异构是指不同的处理器集成到一起?CPU与DSP、FPGA算异构吗?
不同的处理器集成到一起只不过是异构计算的一个要素而已,更重要的是要用这些不同的处理器组合到一起去实现通用计算。这就涉及到一系列开发方法、流程和工具。如果不是去实现通用计算,其实就是一种独特形式的“嵌入式系统设计”而已。这部分内容在课程视频中有专门讲到。
目前研究主要是用专用硬件如DSP、FPGA对原来的CPU系统进行加速,但并没有进一步挖掘原系统的计算能力,未来商用的异构计算系统应该是主机端和设备端各司其职,将计算密度大的模块放在设备端进行加速,而将逻辑控制多的模块放在主机端,这样才能充分发挥异构系统的优势。
并不需要时钟级别的同步,而是在系统级别解决同步的问题。利用的是多层存储结构,基于barrier的编程方法等使数据一致性得到保证即可。这是在任何多核心系统或者复杂SoC设计中都被经常采用的方法。如果对这个问题希望有深入的了解,应该阅读多核片上系统设计方面的书籍或论文。
问题:用ARM体系结构和X86体系结构作为Host,有什么区别吗?
本质上没有区别,Host需要是一个处理器来实现“主控”的功能,完成一些“准备性”和“总结性”的工作。区别只在于ARM体系结构的处理器和X86体系结构的处理器在执行程序时本身性能以及能效上的差别。
Altera的SoC-de1开发板将ARM和FPGA集成到片上,相比X86体系中需要将数据在Host端和设备端传输,带来的好处是传输速度快,延迟小。
问题:Host和Device对OpenCL的效能哪个影响大?
由于运算加速主要依靠Device来实现,因此Device的影响更大。但反过来说,OpenCL编程的时候需要考虑到不同Device的特性来对代码结构和代码风格加以优化。我们之前发表过多篇论文来讨论这个问题,在视频课程的最后部分有所介绍。
Device端影响更大,因为其计算密度大,在系统设计时研究将哪些模块放在Device端是一个关键点。
目前主要用于运算加速,也就是高性能计算。但由于高性能计算用途广泛,因此也可以说异构计算可以被用于很多领域。包括但不限于金融分析、天气预报、大规模仿真等。
问题:KNN算法中FPGA仍然是加速器,多核异构与X86+FPGA有啥区别?
我猜想这位朋友想问的是异构计算和利用传统的设计方法在FPGA上实现一个加速器之间有什么区别?这其实就是代表了开发方法的不同。用传统的设计方法在FPGA上实现一个加速器是将CPU上的软件和FPGA上的加速器分开设计,也就是传统的嵌入式系统的设计方法。而异构计算是在统一的开发平台,统一的编程模型下开发。使用OpenCL的编程框架使得CPU+FPGA架构开发“一体化”。
问题:开发者在适应异构计算时,采用的程序开发有哪些需要特别注意到的地方吗?
这个问题很大,首先需要符合编程规范,其次需要根据器件的特点做一些代码结构上的优化。具体内容可以阅读《FPGA异构计算》这本书以及OpenCL编程相关章节。
需要具备并行编程的思想,在系统设计时最需要考虑的是模块划分。
问题:如果我必须处理大稀疏矩阵,最好是用循环双向链表,否则内存放不下,我已在CPU上实现算法了,有没有可能实现异构运算?
这种情况下需要你改变算法,在适合于矩阵运算的编程方法(如向量运算)来加以处理,才有可能实现算法的并行化。这方面的并行编程技巧和算法优化需要学习,当然这比单纯的写CPU上的串行处理程序还是要难很多。
问题:GPU的OpenCL内核可以直接移植到FPGA上吗?
很多时候需要修改,并不能保证能直接移植。但修改的部分并不一定太多,取决于具体的代码。
GPU的内核代码经过一定修改可以移植到FPGA上,这也是OpenCL强调通用性的表现。
问题:老师好!我想问的是,对于一个初学者。如果想进行FPGA异构计算的学习和开发,我所需要做的工作都应该包括那几个方面呢。
建议首先把OpenCL的编程方法学会。由于FPGA综合一次时间太长,所以调试代码很困难。因此如果学习OpenCL更好的平台是GPU,可以选择AMD公司支持OpenCL的GPU。
1.有C\C++编程基础;
2.熟悉GPU并行编程思想;
3.对FPGA硬件架构有一定了解即可。
问题:处理器之间的数据传输消耗的时间,是否会抵消耗费心血优化程序所带来的性能提升呢?
这确实是一个问题。所以现在要靠几个方面来解决这一问题。首先就是单片化,把CPU和FPGA集成到一个芯片上,两者之间的传输时间可以下降。第二就是采用“设备间流水”方法来适当降低这方面的影响。第三就是异构计算的适用范围,目前更多的适用于高吞吐率的应用而非低延迟的应用。最新的研究还包括一些体系结构级的研究。
目前的内存访问机制限制了子系统之间的频繁交互,所以设计时应尽量将计算密度高的模块放在一起,从而减少传输延迟。相信随着硬件加速应用需求的增多,业界能够给出更可靠完善的解决方案。
一定程度上可以这么说,在AMD公司内部从事异构计算相关开发工作的工程师也常常被称为“算法优化工程师”。但从广义来讲大部分做实现的工程师其实都是在做优化,传统的FPGA工程师在实现算法的过程也可以认为是一个算法优化的过程。
问题:做异构计算开发与平常的FPGA开发来说,从思维、观念上需要哪些改变?
需要从更高的层级,也就是体系结构的层级上面去理解整个系统的运行过程。而不是传统的RTL级关注的那些点。
问题:我现在想的是先对OpenCL在GPU的开发中具有一定的了解后,再进行移植到FPGA上。这样的思路对么?
在初期学习OpenCL的时候这样的思路是对的,但是后期要想发挥FPGA的最大能效还需要对FPGA内部结构和OpenCL到FPGA内部资源的映射关系有全面的了解。
目前一个FPGA能串行运行多个内核程序,但无法同时并行执行多个内核程序。相信随着硬件虚拟化需求的增加以及技术的跟进,以后的标准中会对这方面有所支持。
本次公益演讲的开讲时间安排在9月25日的晚上八点,100多网友参与了在线学习,随后几天学习人数更是超过200人之多。
感兴趣的网友点击链接观看演讲视频在线学习:
http://webinar.chinaaet.com/zh-CN/Chinaaet/Youke/CourseDetail?courseId=541