集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

ISDF2016经典之B6:使用OpenCL的高效加速

[复制链接]
 楼主| lcytms 发表于 2018-4-21 20:25:59 | 显示全部楼层
24
        接下来我们讨论下一个问题,就是关于Kernel函数的问题。
        现在我们提到了Kernel函数一个非常重要的特点,就是能够并行化执行。
        它能够完成CPU加速的一个基本的前提条件也就是它能够并行执行。
        那么OpenCL Kernel如何在设计里面被表达的呢?
        从这样一个函数,大家可以发现,这个里面所谓的并行性的描述,不是传统意义上一个循环的隐式描述,而是显式描述。
        它用get_global_id会烦会设计里面所有独立计算的索引。
        这个索引在OpenCL的数据结构看的话,就是一个矢量,或者是一个数组。
        这个矢量里面,每一个单元代表什么?
        代表一个独立计算的单元。
        第二步,它要做什么事啊?
        它做一个加法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2018-4-21 20:27:10 | 显示全部楼层
25
        从这里面,大家可以看到,在我们的OpenCL Kernel里面,它的并行的描述,是显式的描述。
        除此之外的话,这个胶片里面还看到另外一个有趣的话题,就是所谓的可移植性。
        OpenCL Kernel标准里面所定义的Kernel函数,从语法的角度来说,不管是用什么样的加速器,GPU也好,CPU也好,FPGA也好,它用同样的方法描述。
        用这个方法描述的算法,是不是能够在这个器件运行呢?
        答案是肯定的,它是可以运行的。
        它的Performance是不是也能够保证呢?
        答案是否定的,是不能够保证的。
        在不同种类的器件里面,优化技术是完全不一样的。
        甚至是在大多数的GPU器件之间,不同的CPU之间,不同型号、不同系列的CPU之间,它优化的技术都是不一样的。
 楼主| lcytms 发表于 2018-4-21 20:34:15 | 显示全部楼层
26
        FPGA里面,我不同大小的FPGA,不同系列的FPGA,相同的OpenCL代码,它会有相同的Performance。
        而且如果器件等级更高,它工作频率更高,Performance就会更高。
        你的器件越大,并行度越大,Performance越高。
        也就是说,在同种器件之间的可移植的这种Performance能保证的FPGA的性能特性。
        接下来的图是关于FPGA的设计流程。
        首先呢,从设计输入的角度来说,它设计输入是两个。
        一个是主机上运行的标准的host.c文件。
        在Deveice上运行的Quartus的.cl函数。
        Quartus的.cl函数,它本质上来说,并不能独立地工作,它必须要与板卡的BSP配合,形成一个完成的工程,才能够在板卡上运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2018-4-21 20:34:56 | 显示全部楼层
27
        所以说,这里有一个BSP的概念。
        从这个图上,大家可以非常清晰地看到,整个FPGA的流程,分成三个输入部分,BSP部分,Quartus的.cl部分,和主机c部分。
        在这个里面,OpenCL的使用者,只关注host.c和cl。
        BSP的开发是由板卡设计者来完成的。
        也就是说,这里面就把整个OpenCl的使用者分成了两部分,一部分是做应用开发的软件工程师,另一部分是让这个板子具备OpenCL运行环境支持特性的人。
        这一部分的开发,本质上和OpenCL没有这些关系,它只要符合一定的规范。
 楼主| lcytms 发表于 2018-4-21 20:35:33 | 显示全部楼层
28
        这是传统的RTL技术和传统的c driver等等技术来完成的。
        下面是关于开发的基本流程。
        在这个流程里面,主要是想说明一个什么样的问题呢?
        FPGA编译起来非常长,大家可能有体会,FPGA编译起来可能一个小时、两个小时,甚至三个小时到十个小时。
        既然FPGA编译这么长,我怎么来debug整个环境呢?
        很显然,比如说我改这么一个设计,十个小时之后才看到结果,这就不可接受了。
        OpenCL里面,它提供了很多工具,有所谓的仿真器,有所谓的优化报告。
        仿真器可以完成对OpenCL的语法检查和功能的一个仿真。
        它支持printf打印,也就是说,所有功能性和语法性的东西,可以在这个层面完成。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2018-4-21 20:37:24 | 显示全部楼层
29
        第二,是关于优化报告。
        优化报告会告诉你,你所描述出来的那种算法,它并行的硬件结构是什么样子的?
        这个硬件结构是不是你所需要的?
        你通过check这个结构来认定它做出来的硬件结构,和你所设想的硬件结构是一致的情况下,才开始第三步的编译。
        也就是说,会把尽量多的工作放到前面三步。
        前面三步如果做得好的话,后面的迭代次数会变得很少。
        而迭代会带来一个什么样的方式呢?
        最后一步迭代,经过几个小时的编译之后的话,它可以得到一个所谓的profile文件。
        这个文件它会告诉你,你的设计在设计运行情况下,它的性能瓶颈在哪里?
        你load大概每秒多少次?
        你的Mem带宽理论上是多少?
        用了多少?
        profile文件都会告诉你。
        这个是用OpenCL SDK来开发的一个基本流程和基本思路。
 楼主| lcytms 发表于 2018-4-21 20:39:35 | 显示全部楼层
30
        下一个问题就是关于FPGA来做这个事情的一个优势的问题。
        FPGA里面,它有很多计算资源,它有1TFLOPS的浮点计算性能,8TB/s的带宽,这样的local存储单元。
        我们要做的事情是什么样的呢?
        在我们的整个优化过程中,我们要尽可能把数据要放到local Mem里面去,让它尽可能地靠近计算单元。
        这一点是优化FPGA的一个思路。
        最后,我们介绍第四点。
        前面是介绍,下面我们通过实例。
        第一个实例,是关于GZIP的压缩的一个实例。
        这个是OpenCL的GZIP的压缩。
        这张图上给出了4种不同的开发方式,分别是OpenCL开发,IBM的Verilog的开发,ASIC开发,和Intel的纯的CPU开发。
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2018-4-21 20:40:43 | 显示全部楼层
31
        可以发现,如果比Performance的话,显然是硬件支持更快一点。
        硬件里面最快的是什么呢?
        最快的显然是用Verilog来描述的,但是Verilog的开发时间是比较长的。
        这个设计里面,用OpenCL开发的话,只用了不到一个月的时间,就完成了开发。
        而相应的Verilog的开发的话,是超过了3个月。
        那么OpenCL的性能怎么样呢?
        它有10%的性能降低,和12%的更大的资源消耗,也是有它的代价的。
        这个胶片回答了一个什么样的问题呢?就是OpenCL开发效率的问题。
        不是说对所有的设计,OpenCL都能够达到这么高的效率,而是说在一个良好设计的基础上,它是能够做到这一点的。
        它有个前提条件,是有一个良好设计。
 楼主| lcytms 发表于 2018-4-21 20:42:51 | 显示全部楼层
32
        不是说你随便写段代码,我都能够做到这一点的。
        第二个例子是关于神经网络,这说明一个什么样的问题呢,对于神经网络这样的计算敏感型的应用,用OpenCL来开发的话,我可以达到一个不比RTL更低的Performance。
        从这张胶片,大家可以看到,我们在A10的115的器件上面,用纯OpenCL的办法进行开发,我们如果使用32位的单精度浮点的这种方式,我能够做到每秒575帧的这样一个Performance。
        功耗大概是35W,我们每W大概能够处理16.4帧图片。
        如果我们使用半精度浮点来实现的话,那么我们Performance可以达到1020帧。
        这个数据是一个什么样的概念呢?
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2018-4-21 20:45:08 | 显示全部楼层
33
        理论上来说,我的FPGA用OpenCL在用40W的功耗的时候,我几乎达到了峰值1.4T。
        当然,这里面有快速算法的一个共性在里面。
        就是说,用OpenCL来开发,仍然可以把FPGA的峰值的1.3T的计算能力用到了1个T左右。
        下面一个例子,是关于OpenCL在SoC器件上面的一个实现。
        在这里,它做了一个所谓的多功能的打印机,它主要完成所谓的图像处理。
        图像处理,主要有RGB,然后有CMYK的打印。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-23 11:43 , Processed in 0.063641 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表