0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通用计算以及OpenCL究竟是什么?

e9Zb_gh_8734352 来源:互联网 作者:佚名 2018-07-30 09:17 次阅读

OpenCL是当前一个通用的由很多公司和组织共同发起的多CPU\GPU\其他芯片 异构计算(heterogeneous)的标准,它是跨平台的。旨在充分利用GPU或者FPGA强大的并行计算能力与CPU进行协同工作,更高效的利用硬件高效的完成大规模的(尤其是并行度高的)计算。

01

异构计算、GPGPU与OpenCL

利用GPU对图像渲染进行加速的技术非常成熟,但是GPU的芯片结构擅长大规模的并行计算,CPU则擅长逻辑和流程控制,为了不局限于图像渲染,人们希望将这种计算能力扩展到更多领域,所以这也被称为GPGPU(即通用处计算处理的GPU)。

通俗来讲,CPU并不适合计算,它是多指令单数据流(MISD)的体系结构,更加擅长的是做逻辑控制,而数据处理基本是单流水线的,所以我们的代码for(i=0;...;i++)在CPU上要重复迭代的跑很多遍,但是在GPU上则不是这样,GPU是典型的单指令多数据(SIMD)的体系结构,它不擅长逻辑控制,但是天生的向量计算机,对于for(i=0;...;i++)这样的代码有时只需要跑一遍,所以图形世界中那么多的顶点、片段才能快速、并行的在显卡中渲染处理。

另外,GPU的晶体管可以到几十亿个,而CPU通常只有几亿个.

如上图是NVidia Femi100的结构,它有着大量的并行计算单元。

所以人们就想如何将更多的计算代码搬到GPU上,让他不只做rendering,而CPU只负责逻辑控制,这种一个CPU(控制单元)+几个GPU(有时可能再加几个CPU)(计算单元)的架构就是所谓的异构编程(heterogeneous),在这里面的GPU就是GPGPU。异构编程的前景和效率是非常振奋人心的,在很多领域,尤其是高并行度的计算中,效率提升的数量级不是几倍,而是百倍千倍。

NVIDIA在很早就推出了利用其显卡的GPGPU计算 CUDA架构,当时的影响是很大的,将很多计算工作(科学计算、图像渲染、游戏)的问题提高了几个数量级的效率,CUDA是NVDIA主力推的通用计算架构,但是CUDA最大的局限就是它只能使用Nvidia自的显卡,对于广大的AMD卡用户鞭长莫及。

OpenCL则在之后应运而生,它由几大主流芯片商、操作系统、软件开发者、学术机构、中间件提供者等公司联合发起,它最初由Apple提出发起标准,随后Khronos Group成立工作组,协调这些公司共同维护这套通用的计算语言。Khronos Group听起来比较熟悉吧,图像绘制领域著名的软硬件接口API规范著名的OpenGL也是这个组织维护的,其实他们还维护了很多多媒体领域的规范,可能也是类似于Open***起名的(所以刚听到OpenCL的时候就在想它与OpenGl有啥关系),OpenCl没有一个特定的SDK,Khronos Group只是指定标准(你可以理解为他们定义头文件),而具体的实现则是由不同参与公司来做,这样你会发现NVDIA将OpenCL做了实现后集成到它的CUDA SDK中,而AMD则将其实现后放在所谓是AMD APP (Accelerated Paral Processing)SDK中,而Intel也做了实现,所以目前的主流CPU和GPU都支持OpenCL架构,虽然不同公司做了不同的SDK,但是他们都遵照同样的OpenCL规范,也就是说原则上如果你用标准OpenCl头中定义的那些接口的话,使用NVIDIA的SDK编的程序可以跑在AMD的显卡上的。但是不同的SDK会有针对他们芯片的特定扩展,这点类似于标砖OpenGL库和GL库扩展的关系。

OpenGL的出现使得AMD在GPGPU领域终于迎头赶上的NVIDIA,但是NVIDIA虽为OpenCL的一员,但是他们似乎更加看重自己的独门武器CUDA,所以N家对OpenCL实现的扩展也要比AMD少,AMD由于同时做CPU和GPU,还有他们的APU,似乎对OpenCL更来劲一些。

02

OpenCL的诞生

OpenCL也是通过在GPU上写代码来加速,只不过他把CPU、GPU、其他什么芯片给统一封装了起来,更高了一层,对开发者也更友好。

其实最开始显卡是不存在的,最早的图形处理是放在CPU上,后来发现可以再主板上放一个单独的芯片来加速图形绘制,那时还叫图像处理单元,直到NVIDIA把这东西做强做大,并且第一给它改了个NB的称呼,叫做GPU,也叫图像处理器,后来GPU就以比CPU高几倍的速度增长性能。

开始的时候GPU不能编程,也叫固定管线的,就是把数据按照固定的通路走完和CPU同样作为计算处理器,顺理成章就出来了可编程的GPU,但是那时候想在GPU上编程可不是容易的事,你只能使用GPU汇编来写GPU程序,GPU汇编?听起来就是很高级的玩意儿,所以那时使用GPU绘制很多特殊效果的技能只掌握在少数图形工程师身上,这种方式叫可编程管线。

很快这种桎桍被打破,GPU上的高级编程语言诞生,在当时更先进的一些显卡上,像C一样的高级语言可以使程序员更加容易的往GPU写代码,这些语言代表有nvidia和微软一起创作的CG,微软的HLSL,openGl的GLSL等等,现在它们也通常被称为高级着色语言(Shading Language),这些shader目前已经被广泛应用于我们的各种游戏中。

在使用shading language的过程中,一些科研人员发现很多非图形计算的问题(如数学、物理领域的并行计算)可以伪装成图形问题利用Shading Language实现在GPU上计算,而这结果是在CPU上跑速度的N倍,人们又有了新的想法,想着利用GPU这种性能去解决所有大量并行计算的问题(不只图形领域),这也叫做通用处理的GPU(GPGPU),很多人尝试这样做了,一段时间很多论文在写怎样怎样利用GPU算了哪个东东。。。但是这种工作都是伪装成图形处理的形式做的,还没有一种天然的语言来让我们在GPU上做通用计算。这时又是NVIDIA带来了革新,09年前后推出的GUDA架构,可以让开发者在他们的显卡上用高级语言编写通用计算程序,一时CUDA热了起来,直到现在N卡都印着大大的CUDA logo,不过它的局限就是硬件的限制。

OpenCL则突破了硬件的壁垒,试图在所有支持的硬件上搭建起通用计算的协同平台,不管你是cpu还是gpu通通一视同仁,都能进行计算,可以说OpenCL的意义在于模糊了主板上那两种重要处理器的界限,并使在GPU上跑代码变得更容易。

01

OpenCL架构

上面说的都是关于通用计算以及OpenCL是什么,下面就提纲挈领的把OpenCL的架构总结一下:以下是OpenCL硬件层的抽象

它是一个Host(控制处理单元,通常由一个CPU担任)和一堆Computer Device(计算处理单元,通常由一些GPU、CPU其他支持的芯片担任),其中Compute Device切分成很多Processing Element(这是独立参与单数据计算的最小单元,这个不同硬件实现都不一样,如GPU可能就是其中一个Processor,而CPU可能是一个Core),其中很多个Processing Element可以组成组为一个Computer Unit,一个Unit内的element之间可以方便的共享memory,也只有一个Unit内的element可以实现同步等操作

02

内存架构

其中Host有自己的内存,而在compute Device上则比较复杂,首先有个常量内存,是所有人能用的,通常也是访问最快的但是最稀少的,然后每个element有自己的memory,这是private的,一个组内的element有他们共用的一个local memery。仔细分析,这是一个高效优雅的内存组织方式。数据可以沿着Host-》gloabal-》local-》private的通道流动(这其中可能跨越了很多个硬件)

03

软件层面的组成

这些在SDK中都有对应的数据类型

  1. setup相关:

    Device:对应一个硬件(标准中特别说明多core的CPU是一个整个Device)

    Context:环境上下文,一个Context包含几个device(单个Cpu或GPU),一个Context就是这些device的一个联系纽带,只有在一个Context上的那些Device才能彼此交流工作,你的机器上可以同时存在很多Context。你可以用一个CPu创建context,也可以用一个CPU和一个GPU创建一个。

    Command queue:这是个给每个Device提交的指令序列

  2. 内存相关:

    Buffers:这个好理解,一块内存

    Images:毕竟并行计算大多数的应用前景在图形图像上,所以原生带有几个类型,表示各种维度的图像。

    gpu代码执行相关:

    Program:这是所有代码的集合,可能包含Kernel是和其他库,OpenCl是一个动态编译的语言,代码编译后生成一个中间文件(可实现为虚拟机代码或者汇编代码,看不同实现),在使用时连接进入程序读入处理器。

    Kernel:这是在element跑的核函数及其参数组和,如果把计算设备看做好多人同时为你做一个事情,那么Kernel就是他们每个人做的那个事情,这个事情每个人都是同样的做,但是参数可能是不同的,这就是所谓的单指令多数据体系。

    WorkI tem:这就是代表硬件上的一个Processing Element,最基本的计算单元

  3. 同步相关:

    Events:在这样一个分布式计算的环境中,不同单元之间的同步是一个大问题,event是用来同步的

他们的关系如下图

上面就是OpenCL的入门介绍, 在游戏领域,OpenCL已经有了很多成功的实践,好像EA的F1就已经应用了OpenCL,还有一些做海洋的lib应用OpenCL(海面水波的FFT运算在过去是非常慢的),另外还有的库干脆利用OpenCL去直接修改现有的C代码,加速for循环等,甚至还有OpenCl版本的C++ STL,叫thrust,所以我觉得OpenCL可能会真正的给我们带来些什么

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4424

    浏览量

    126737
  • OpenCL
    +关注

    关注

    2

    文章

    47

    浏览量

    33128
  • 异构计算
    +关注

    关注

    2

    文章

    93

    浏览量

    16159

原文标题:异构计算以及OpenCL介绍

文章出处:【微信号:gh_873435264fd4,微信公众号:FPGA技术联盟】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    工业物联网究竟是什么呢?它又有哪些作用呢?

    随着科技的快速发展,物联网技术已经逐渐渗透到我们生活的各个角落,而 工业物联网(IIoT) 更是引领着工业领域的数字化转型。那么,工业物联网究竟是什么呢?它又有哪些作用呢?本文将对此进行深度解析
    的头像 发表于 04-22 15:26 91次阅读

    STM32擦除后数据究竟是0x00还是0xff ?

    STM32擦除后数据究竟是0x00还是0xff ,百度查了许多发现大多数都是0xff的多,都说SD卡(TF)储存介质是Flash 所以擦除后为0xff,但是我遇到了读出来的数据是0x00的情况,为什么呢
    发表于 04-18 07:59

    MOSFET的栅源振荡究竟是怎么来的?栅源振荡的危害什么?如何抑制

    MOSFET的栅源振荡究竟是怎么来的呢?栅源振荡的危害什么?如何抑制或缓解栅源振荡的现象呢? MOSFET(金属-氧化物-半导体场效应晶体管)的栅源振荡是指在工作过程中,出现的栅极与源极之间产生
    的头像 发表于 03-27 15:33 497次阅读

    【量子计算机重构未来 | 阅读体验】+量子计算机的原理究竟是什么以及有哪些应用

    本书内容从目录可以看出本书主要是两部分内容,一部分介绍量子计算机原理,一部分介绍其应用。 其实个人也是抱着对这两个问题的兴趣来看的。 究竟什么是量子计算机相信很多读者都是抱着这个疑问
    发表于 03-11 12:50

    吸尘器究竟是如何替你“吃灰”的【其利天下技术】

    如今,吸尘器已成为大多数人居家必备的小家电产品,那么说起吸尘器,你对吸尘器有了解多少呢?不知道大家知不知道它的原理是什么?今天我们就来说一说吸尘器究竟是如何替你“吃灰”的。
    的头像 发表于 03-07 21:17 554次阅读
    吸尘器<b class='flag-5'>究竟是</b>如何替你“吃灰”的【其利天下技术】

    “其貌不扬”的共模电感究竟是如何做到抗干扰的呢?

    “其貌不扬”的共模电感究竟是如何做到抗干扰的呢? 共模电感是一种用于滤除电子设备中的共模噪声的重要元件,其主要作用是提供阻抗来滤除共模干扰信号。尽管外观看起来“其貌不扬”,但共模电感通过其特殊
    的头像 发表于 01-11 16:27 230次阅读

    同步电机的转数同步究竟是与什么同步啊?

    同步电机的转数同步究竟是与什么同步啊? 所有的同步电机的转数都一样吗?还是与电机的极对数有关系呢?
    发表于 12-19 06:44

    半导体内部电荷运动的机制究竟是什么呢?

    半导体内部电荷运动的机制究竟是什么呢? 半导体材料的内部电荷运动机制是半导体物理学和固体物理学的重要研究领域之一。在这篇文章中,我们将详细、真实地探讨半导体内部电荷运动的机制,从电子的能带结构
    的头像 发表于 11-30 11:28 353次阅读

    一体成型贴片电感在使用中发热究竟是否会影响运行

    电子发烧友网站提供《一体成型贴片电感在使用中发热究竟是否会影响运行.docx》资料免费下载
    发表于 11-13 16:28 1次下载

    OSPF究竟是如何规避路由环路的呢?

    OSPF究竟是如何规避路由环路的呢? OSPF(开放式最短路径优先)是一种内部网关协议(IGP),用于在一个单一的自治系统(AS)内进行路由选择,它是一种链路状态协议(LSP)。在OSPF中,路由器
    的头像 发表于 11-06 11:10 1007次阅读

    计算究竟是如何理解并执行我们所写的代码的呢?

    在编写了大量代码之后,不禁让人思考,计算究竟是如何理解并执行我们所写的代码的呢?这个问题将引导我们深入了解计算机的内部工作原理,从二进制到逻辑电路,再到运算器和控制器的协同工作,探究计算
    发表于 09-05 09:54 292次阅读
    <b class='flag-5'>计算</b>机<b class='flag-5'>究竟是</b>如何理解并执行我们所写的代码的呢?

    开关电源炸机究竟是什么原因呢

    电源工程师最怕什么?炸机!炸机的状况总会成为他们心里说不出的“痛”,里面昂贵的元器件如果出现炸机状况,那么在设计过程中的成本就会大幅提升。那么问题来了,开关电源炸机究竟是什么原因呢?炸机的原因有很多
    的头像 发表于 09-05 08:10 839次阅读
    开关电源炸机<b class='flag-5'>究竟是</b>什么原因呢

    ARM Mali-T600系列GPU OpenCL开发人员指南

    。 GPU被设计为同时执行多个线程。 它们并行运行包含相对较少控制代码的计算密集型数据处理任务。 GPU通常包含比应用程序处理器多得多的处理元素,因此计算速度比应用程序处理器高得多。 OpenCL是第一种开放标准语言,使开发人员
    发表于 08-24 07:07

    SVPWM调制波的数学表达究竟是怎样的呢?

    SVPWM可以通过载波比较的方法实现开关控制信号输出。那SVPWM的调制波的数学表达究竟是怎样的呢?答案是SVPWM实质是一种对在三相正弦波中注入了零序分量的调制波进行规则采样的一种变形 SPWM。
    发表于 07-10 17:16 1014次阅读
    SVPWM调制波的数学表达<b class='flag-5'>究竟是</b>怎样的呢?

    边缘计算是什么,和云计算有什么不同

    当提及在线存储或数据传输时,你一定会联想到“云计算”这个词。然而“边缘计算”却显有人知,它究竟是什么呢?英飞凌可为各种应用中的边缘设备提供传感器和执行器。
    发表于 06-07 09:21 1066次阅读