欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld

技术交流QQ群:433250724,欢迎对算法、技术、应用感兴趣的同学加入。


关于摩尔定律:

摩尔定律1965年提出,晶体管密度是按照每年翻倍发展的,之后的趋势也是这样——每一代芯片的的时钟频率提高50%,而同时工艺节点减小了0.3,功耗密度翻倍(保持功耗相同的情况下,面积0.7*0.7=0.49,因此提高频率使得性能提升了);而在2000年中期之后,出现了物理尺寸更小的器件,意味着,我们没有办法保持功耗密度不变,而同时提高频率,结果我们看到自此之后,时钟频率并没有显著提高,需要通过并行来提高性能,所以多核CPU流行起来。即使是最基本的处理器,超标量和无序指令执行等高级体系结构都成为基本配置,软件和其他开发工具也都应用于开发同构和分布式系统。

异构计算:

需要提高程序执行性能,只是通过并行是不够的,因为不同的应用软件的行为是不同的:
(1)有大量控制代码的程序,如搜索、parsing(解析),适合运行在超标量CPU上,支持分支预测机制;
(2)图像处理等需要大量数据处理的程序,适合高速运行在矢量体系结构上(典型的代表就是GPU,DSP)
(3)还有一类需要大量计算的应用,最适合在针对应用进行优化的硬件上执行,比如FPGA/ASIC。
因此,没有一种硬件体系结构可以做所有的事情,而功能最强大的系统会应用到多种硬件,以利用CPU/GPU/DSP/FPGA等不同组件的优势——这就是异构计算。程序员不仅仅是写一段代码丢给编译器执行就行了,还需要对执行硬件有所了解,在异构环境中开发的难度往往比较大。
传统的异构开发人员,为CPU和DSP编写顺序执行软件,一般来说像C语言这样的代码;而为FPGA编写底层硬件语言,如verilog或者VHDL,实现细粒度的并行和矢量功能。这样的开发往往比较低效。现在GPU上的开发有CUDA这样优秀的编程接口,充分发挥GPU数据并行的优势,但是只能在NVIDIA的GPU上运行。于是,需要有一种标准的异构编程模型,来完成跨平台的并行编程任务。
OpenCL就可以完成这样的任务,用同一的编程语言实现异构平台编程。本笔记重点关注OpenCL在CPU+FPGA的异构编程环境中的使用,因为随着FPGA的发展,我个人认为这将成为一种趋势。但是实际上,因为opencl是跨平台的,所以其他硬件环境也是类似的。
OpenCL初印象
(以下的图来自于[2])

OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。

OpenCL 应用程序含有两部分(host和kernel)。OpenCL 主程序是纯软件例程,以标准C/C++编写,可以运行在任何类型的微处理器上。例如,这类处理器可以是FPGA中的嵌入式软核处理器、硬核ARM处理器或者外置x86处理器。如图所示。在这一主软件例程执行期间的某一点,某一功能有可能需要很大的计算量,这就可以利用并行器件的高度并行加速功能,例如CPU、GPU、FPGA等器件。要加速的功能被称为OpenCL内核。采用标准 C(C99)编写这些内核。

下图中的例子对两个数组a和b进行矢量加法,将结果写回输出数组中。矢量的每一元素都采用了并行线程,当采用像 FPGA这类具有大量精细粒度并行单元的器件进行加速时,能够很快的计算出结果。主程序使用标准OpenCL应用程序接口(API),支持将数据传送至FPGA,调用FPGA内核,传回得到的数据。

对CPU和GPU来说,并行线程可以在不同的内核中执行,而FPGA能够提供不同的策略。可以把内核功能传送到专用深度流水线硬件电路中,它使用了流水线并行处理概念,在本质上就是多线程的。这些流水线的每一条都可以复制多次,与一条流水线相比,提供更强的并行处理功能。如图5所示,可以通过级联功能单元实现矢量加法内核,在OpenCL描述中实现每一操作,进行复制以满足实际应用的吞吐量和延时要求。

虽然所显示的只是一个简单表征,但每个功能单元都可以是深度流水线,以保证最终电路的工作频率足够高。此外,编译器可以建立电路来管理与外部系统的通信。在这个例子中,DDRx控制器和PHY连接至内核,使其能够高效访问片外阵列。类似的,PCIe IP自动例化,连接至内核,这样,x86主机能够通过OpenCLAPI与FPGA加速器进行通信。

在FPGA上实现OpenCL标准的优势:
采用FPGA可以对算法进行深度定制,就像在一块白板上设计。传统的底层语言设计需要工程师对资源、面积、频率、流水、并行这些问题做适当的均衡,因此需要很丰富的经验才能设计很棒的程序;而OpenCL试图来降低这一开发门坎。如下图,采用和软件开发一样的思路来开发。

这一方法可以与传统基于FPGA的设计方法相比。这里,设计人员的主要工作是对硬件按照每个周期进行描述,用于实现其算法。传统流程涉及到建立数据通路,如下图所示,通过状态机来控制这些数据通路,使用系统级工具(例如,SOPCBuilder、PlatformStudio)连接至底层IP内核,由于必须要满足外部接口带来的约束,因此,需要处理时序收敛问题。OpenCL编译器的目的是帮助设计人员自动完成所有这些步骤,使他们能够集中精力定义算法,而不是重点关注乏味的硬件设计。以这种方式进行设计,设计人员很容易移植到新FPGA,性能更好,功能更强,这是因为OpenCL编译器将相同的高级描述转换为流水线,从而发挥了FPGA器件的优势。

案例:MonteCarloBlack-Scholes方法

在金融市场上最重要的一个基准测试方法是通过Monte Carlo Black-Scholes方法计算期权价格。该方法基于对底层股票价格的随机仿真,以及数百万不同路径上的平均预期收益。图8以图形化的方式显示了这类仿真的一个例子。

图9显示了进行这一计算的高级算法结构。首先采用Mersenne旋转随机数发生器来创建均匀分布的数值。将随机数序列送入逆正态累积密度函数,以产生正态分布序列。然后,使用几何布朗运动,这些随机数用于仿真股票价格的变化。在每一仿真通路的最后,记录看涨期权的收益,进行平均来产生收益预期值。整个算法通过大约300行的OpenCL代码来实现,可以从FPGA移植到CPU、GPU。

利用针对Altera FPGA开发的OpenCL工作台,可以产生很好的基准测试结果,如表1所示。与相应的GPU相比,面向Stratix IV FPGA EP4SGX530的OpenCL工作台在吞吐量上超过了CPU和GPU。与相应的GPU相比,在执行相同的代码时,FPGA解决方案不但提高了吞吐量,保守估计,功耗也只有其五分之一。速率和高功效相结合,降低了大计算量应用的功耗需求。

(这个数据有点老了,现在的FPGA和GPU在浮点处理峰值上都远远大于表中数据,GPU的浮点运算性能绝对是超过FPGA的,因为但就是为这个而设计,但是实际算法还受很多其他因素影响。实际算法的性能就不一定了。另外在功率上FPGA目前还是有一定的优势的。)

结论

利用FPGA上的OpenCL标准,与目前的硬件体系结构(CPU、GPU,等)相比,能够大幅度提高性能,同时降低了功耗。此外,与使用Verilog或者VHDL等底层硬件描述语言(HDL)的传统FPGA开发方法相比,使用OpenCL标准、基于FPGA的混合系统(CPU+FPGA)具有明显的产品及时面市优势。

参考资料:

[1]支持opencl的设备,https://www.khronos.org/conformance/adopters/conformant-products#opencl

[2]http://articles.csdn.net/AMDyigoukaifajulebu/ziyuanxiazaiyemian_gongju/2012/0906/2809633.html

[3]ALTERA opencl官网,https://www.altera.com.cn/products/design-software/embedded-software-developers/opencl/overview.html

OpenCL学习笔记(一):摩尔定律,异构计算与OpenCL初印象相关推荐

  1. OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. OpenCL安装 安装我不打算 ...

  2. OpenCL学习笔记——整体流程(向量相加)

    OpenCL学习笔记--整体流程 OpenCL可以实现混合设备的并行计算,这些设备包括CPU,GPU,以及其他处理器,比如Cell处理器,DSP等.使用OpenCL编程,可以实现可以值得并行加速代码. ...

  3. kubernetes学习笔记 (二):k8s初体验

    本文采用本地k8s v1.10.3版本开发,如果还没有搭建可参照 kubernetes学习笔记 (一):搭建本地k8s开发环境进行搭建 搭建本地Docker镜像仓库 docker pull docke ...

  4. OpenCL学习笔记一

    什么是OpenCL 百度百科飞机票✈ OpenCL是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成.OpenCL由一门用于编写kernels (在OpenCL设备上运 ...

  5. mysql初体验学习笔记_【MySQL】mycli初体验

    早就听说mycli很好用,今天打算在本地测试机上装一下体验一把. 安装方法很是简单: 一.安装依赖: yum install python-pip python-devel 二.安装mycli pip ...

  6. 青软实训.NET学习笔记(4)--WinForm技术初接触

    1.以下代码表示的是一个最简单的Windows Forms应用程序.当Visual Studio 2010发现一个扩展了System.Windows.Forms.Form的类时,将尝试打开相关的GUI ...

  7. 【Unity3D游戏开发学习笔记】(一)Unity3D初认识

    一.什么是Unity3D Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合 ...

  8. C语言学习笔记—P2(<C语言初阶>+<字符串+转义字符+注释>+图解+题例)

    目录 1.变量的使用 2. 变量的作用域和生命周期 3. 常量 4. 字符串 5. 注释 后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!               ...

  9. C语言学习笔记—P1(<C语言初阶>+<数据类型>+图解+题例)

    目录 1. 什么是C语言? 2. 第一个C语言程序 3. 数据类型 3.1 变量.常量 3.2 定义变量的方法 3.3变量的分类 后记:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇 ...

最新文章

  1. 小猿圈Linux学习-Linux种搜索的命令
  2. 张一鸣、王欣、罗永浩三家对垒微信,张小龙如何应对?
  3. Thinkphp怎样修改模板标签定界符
  4. java之spring mvc之初始spring mvc
  5. 谈谈NLP下一个主战场:万亿参数的预训练模型!
  6. oracle 结果缓存,Result cache结果缓存
  7. MinIO多租户(Multi-tenant)部署指南
  8. Windows Server 2008设置远程桌面连接数
  9. ubuntu搭建nginx服务器,并测试axel与wget的下载速度
  10. [App Store Connect帮助]二、 添加、编辑和删除用户(5)创建一个沙盒测试员帐户...
  11. f分布表完整图a=0.01_Matlab中的数据分析之概率分布与检验实例讲解
  12. jQuery EasyUI快速入门01
  13. 批处理 使用Win7照片查看器
  14. 【opencv】凹点切分,种子计数,细胞计数前提 17/7/25更新
  15. 为什么网站打得开,却ping不通, 网站却打得开
  16. Windows 10调整色温显示器
  17. 国产系统银河麒麟(龙芯MIPS)远程访问自研windows程序
  18. 数据挖掘实战系列 之 Kaggle 练习项目快速入门
  19. 分布式资源管理与任务调度框架Yarn
  20. 图像处理之图像去雾中文综述性论文

热门文章

  1. SwiftUI 游戏源码大全之贪吃蛇游戏基于GeometryReader和Preference
  2. 【分享】2017 开源中国新增开源项目排行榜 TOP 100
  3. 传统呼叫中心系统与智能电销外呼系统的主要区别是什么?
  4. T1099 第n小的质数(信息学一本通C++)
  5. 英特尔® 傲腾™(Optane™)技术
  6. 机器学习眼中的《人民的名义》
  7. 手机拒接电话可完善之处
  8. BigDecimal四舍五入后保留两位小数
  9. 解决 ping命令-请求超时 问题
  10. PyCharm社区版搭建Django框架