OpenCL

OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。

目录

1基本信息

2历史发展

3支持现状

4组织成员

5使用介绍

6框架组成

1基本信息编辑

OpenCL是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。
OpenCL类似于另外两个开放的工业标准OpenGL和OpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL扩展了GPU用于图形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。

2历史发展编辑

OpenCL最初苹果公司开发,拥有其商标权,并在与AMD,IBM,英特尔和nVIDIA技术团队的合作之下初步完善。随后,苹果将这一草案提交至Khronos Group。
2008年6月的WWDC大会上,苹果提出了OpenCL规范,旨在提供一个通用的开放API,在此基础上开发GPU通用计算软件。随后,Khronos Group宣布成立GPU通用计算开放行业标准工作组,以苹果的提案为基础创立OpenCL行业规范。5个月后的2008年11月18日,该工作组完成了OpenCL 1.0规范的技术细节。2010年6月14日,OpenCL 1.1 发布。2011年11月15日,OpenCL 1.2 发布。2013年11月19日,OpenCL 2.0发布。

3支持现状编辑

2009年6月NVIDIA首家发布了支持OpenCL 1.0通用计算规范的驱动程序,支持Windows和Linux操作系统。
2009年8月初AMD首次发布了可支持IA处理器(x86和amd64/x64)的OpenCL SDK——ATI Stream SDK v2.0Beta,立即交由业界标准组织KHRONOS进行审核。目前,该SDK更名为AMD APP SDK。
2012年2月,intel发布了The Intel® SDK for OpenCL* Applications 2012,支持OpenCL 1.1基于带HD4000/2500的显示核心的第三代酷睿CPU(i3,i5,i7).和GPU。
2013年6月,intel发布了第四代酷睿CPU haswell 其内置的HD4600/4400/4200 Iris(锐矩)5000/5100/pro 5200(自带eDRAM缓存)支持OpenCL 1.2(未来可能升级到OpenCL 2.0)
NVIDIA显卡方面 Geforce 8000\9000\100\200\300\400\500\600\700\800(即将发布)均支持OpenCL 1.0-1.2
AMD显卡方面 Radeon HD 4000\5000\6000\7000\Rx 200 均支持OpenCL 1.0-1.2,除Radeon HD4000系列外,其余均会支持OpenCL 2.0
移动平台方面目前高通adreno320/330提供了Android上的OpenCL1.1支持,NVIDIA的Tegra K1也提供了OpenCL 支持。

4组织成员编辑

像Intel、NVIDIA和AMD都是这个标准的支持者,不过微软并不在其列。

5使用介绍编辑

目前,NVIDIA显卡对OpenCL技术支持得比较到位,所以这里仅用NVIDIA的Geforce(精视)系列显卡作解释。
中国用户可以登录英伟达中文官方网站上下载到最新的驱动程序,只要您下载的驱动是195.62版本或更高,就可以在Geforce(精视)8系列或更高级的显卡中开启OpenCL,在安装好新版本的显卡驱动程序并重新启动后,OpenCL就自动开启了。当有需要使用CPU来完成的工作如转换视频时,GPU就会帮助CPU进行运算,以提高转换速度。但是在3D游戏中应该是不会调用OpenCL的,因为显卡有自己的硬件加速功能以及物理引擎,所以Geforce(精视)8系列及以上的显卡就不需要CPU辅助进行渲染了。这时候,您就可以一边玩游戏,一边进行消耗CPU的工作了。
当然同样,在NVIDIA的Quadro系列专业显卡中,同样能够使用OpenCL技术。只要您的显卡能够达到CUDA的要求,就能够正常使用OpenCL,以获得优异的CPU运算效率。、
在AMD-ATI的Stream技术中(现已经改名为AMD APP并行加速技术),已经为日常使用、办公、游戏等提供物理加速。基于OpenCL标准开发,其中,ATI Radeon HD 4000-5000、AMD Radeon HD 6000系列同时支持ATI Stream和AMD APP(由于Stream基于CAL和Brook+语言开发,更适合VLIW5和VLIW4这样的SIMD架构),AMD Radeon HD7000和Radeon Rx 200系列支持AMD APP,运算效率较老架构提升十分明显。
OpenCL 1.0
OpenCL 1.0主要由一个并行计算API和一种针对此类计算的编程语言组成,此外还特别定义了:
1、C99编程语言并行扩展子集;
2、适用于各种类型异构处理器的坐标数据和基于任务并行计算API;
3、基于IEEE 754标准的数字条件;
4、与OpenGL、OpenGL ES和其他图形类API高效互通。
OpenCL 1.1
Khronos Group2010年6月15日宣布,OpenCL通用计算标准的1.1版本已经发放,开发者可以免费下载,并依照新标准开始进行编程。
OpenCL 1.1标准向下兼容1.0版,提供了更多的新功能,并对性能进行了改善。主要新特性包括:
- 支持新数据类型,如3维矢量和新增图像格式。
- 支持处理多Host指令以及跨设备Buffer处理。
- Buffer区域操作,包括对1D、2D、3D三角形区域的读、写和拷贝操作。
- 改进驱动和控制指令执行的事件应用。
- 增加OpenCL内建C功能。
- 通过链接OpenCL和OpenGL事件,高效共享图像和Buffer,改进与OpenGL的互操作性。
OpenCL标准由Khronos Group的OpenCL工作组制定,完全开放,任何开发者都可免费使用。OpenCL工作组成员包括(英文首字母排序):3DLABS、动视暴雪、AMD、苹果、ARM、Broadcom、CodePlay、EA、爱立信、飞思卡尔、富士通、通用电气、GraphicRemedy、HI、IBM、Intel、Imagination Technologies、美国Los Alamos国家实验室、摩托罗拉、Movidia、诺基亚、NVIDIA、Petapath、QNX、高通、RapidMind、三星、Seaweed、S3、意法半导体、Takumi、德州仪器、东芝和Vivante。
OpenCL 2.0
1、共享虚拟内存
主机和设备内核可以直接共享复杂的、包含指针的数据结构,大大提高编程灵活性,避免冗余的数据转移。
2、动态并行
设备内核可以在无需主机交互的情况下进行内核排队,实现灵活的工作调度,避免数据转移,大大减轻主处理器的负担。
3、通用内存空间
无需指定地址空间名称即可为引数(argument)编写函数,不用再为程序里的每一个地址空间名称编写函数。
4、图像
改进图像支持,包括sRGB、3D,内核可以读写同一图像。
5、C11原子操作
新的C11原子和同步操作子集,分配在同一工作组内
6、Pipes
以FIFO格式组织数据的内存对象,可以直接读写,数据结构可简单编程、高度优化。
7、安卓可安装客户端驱动扩展
安卓系统上可将OpenCL作为共享对象进行载入

6框架组成编辑

OpenCL平台API:平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义了为OpenCL应用创建上下文的函数。
OpenCL运行时API:这个API管理上下文来创建命令队列以及运行时发生的其他操作。例如,将命令提交到命令队列的函数就来自OpenCL运行时API。
把上述单独的部分汇集起来,形成OpenCL的一个全景图,如下图所示:

OpenCL全景图

首先是一个定义上下文的宿主机程序。如上图中中的上下文包含两个OpenCL设备、一个CPU和一个GPU。接下来定义了命令队列。这里有两个队列,一个是面向GPU的有序命令队列,另一个是面向CPU的乱序命令队列。然后宿主机程序定义一个程序对象,这个程序对象编译后将为两个OpenCL设备(CPU和GPU)生成内核。接下来宿主机程序定义程序所需的内存对象,并把它们映射到内核的参数。最后,宿主机程序将命令放入命令队列来执行这些内核。
参考资料
  • 1.  图形硬件处理标准 OpenCL   .开源社区网 [引用日期2012-08-16] .

  • 2.  Khronos OpenCL Registry  .Khronos [引用日期2014-03-8] .

  • 3.  OpenCL框架组成 .CSDN [引用日期2013-01-8] .

OpenCL (Open Computing Language,开放计算语言) 是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels (在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分区和数据分区的并行计算机制。

OpenCL类似于另外两个开放的工业标准OpenGL和OpenAL,这两个标准分别用于三维图形和计算机音频方面。OpenCL扩充了GPU图形生成之外的能力。OpenCL由非盈利性技术组织Khronos Group掌管。

目录

  • 1历史
  • 2示例
  • 3参考文献
  • 4相关
  • 5外部链接

历史

OpenCL最初苹果公司开发,拥有其商标权,并在与AMD,IBM,英特尔和nVIDIA技术团队的合作之下初步完善。随后,苹果将这一草案提交至Khronos Group。

2008年6月16日,Khronos的通用计算工作小组成立[1]。5个月后的2008年11月18日,该工作组完成了OpenCL 1.0规范的技术细节[2]。该技术规范在由Khronos成员进行审查之后,于2008年12月8日公开发表[3]。2010年6月14日,OpenCL 1.1 发布[4]

示例

一个快速傅立叶变换的式子:[5]

  // create a compute context with GPU devicecontext = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);// create a command queuequeue = clCreateCommandQueue(context, NULL, 0, NULL);// allocate the buffer memory objectsmemobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);// create the compute programprogram = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);// build the compute program executableclBuildProgram(program, 0, NULL, NULL, NULL, NULL);// create the compute kernelkernel = clCreateKernel(program, "fft1D_1024", NULL);// set the args valuesclSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);// create N-D range object with work-item dimensions and execute kernelglobal_work_size[0] = num_entries;local_work_size[0] = 64;clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

真正的运算: (基于 Fitting FFT onto the G80 Architecture)[6]

  // This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into// calls to a radix 16 function, another radix 16 function and then a radix 4 function__kernel void fft1D_1024 (__global float2 *in, __global float2 *out,__local float *sMemx, __local float *sMemy) {int tid = get_local_id(0);int blockIdx = get_group_id(0) * 1024 + tid;float2 data[16];// starting index of data to/from global memoryin = in + blockIdx;  out = out + blockIdx;globalLoads(data, in, 64); // coalesced global readsfftRadix16Pass(data);      // in-place radix-16 passtwiddleFactorMul(data, tid, 1024, 0);// local shuffle using local memorylocalShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));fftRadix16Pass(data);               // in-place radix-16 passtwiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplicationlocalShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));// four radix-4 function callsfftRadix4Pass(data);      // radix-4 function number 1fftRadix4Pass(data + 4);  // radix-4 function number 2fftRadix4Pass(data + 8);  // radix-4 function number 3fftRadix4Pass(data + 12); // radix-4 function number 4// coalesced global writesglobalStores(data, out, 64);}

Apple的网站上可以发现傅立叶变换的例子[7]

参考文献

  1. ^Khronos Launches Heterogeneous Computing Initiative, 新闻稿. Khronos Group. 2008-06-16 [2008-06-18].
  2. ^OpenCL gets touted in Texas. MacWorld. 2008-11-20[2009-06-12].
  3. ^The Khronos Group Releases OpenCL 1.0 Specification, 新闻稿. Khronos Group. 2008-12-08[2009-06-12].
  4. ^Khronos Drives Momentum of Parallel Computing Standard with Release of OpenCL 1.1 Specification, 新闻稿. Khronos Group. 2010-06-14[2010-10-13].
  5. ^OpenCL. SIGGRAPH2008. 2008-08-14[2008-08-14].
  6. ^Fitting FFT onto G80 Architecture (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. May 2008[2008-11-14].
  7. ^.OpenCL on FFT. Apple. 16 Nov 2009[2009-12-07].

相关

  • GPGPU
  • CUDA
  • DirectCompute
  • 比特币的挖矿

外部链接

  • 开源GPU社区(简体中文)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dubbo的底层原理

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、Duboo基本概念解释 Dubbo是一种分布式服务框架。 Webservice也是一种服务框架,但是webservice并不是分布式的服务框架&…

BOM属性对象方法

本文原链接:https://cloud.tencent.com/developer/article/1018747 BOM 1.window对象 2.location对象 3.history对象 BOM也叫浏览器对象模型,它提供了很多对象,用于访问浏览器的功能。BOM缺少规范,每个浏览器提供商又按照自己想法…

nginx+php+mysql+haproxy+keepalived+NFS,搭建wordpress

实现LNMP 实现环境: 服务版本系统CentOS7.6Mysql5.6.34Nginx1.14.2PHP7.1.30HAProxy1.8.20Keepalived1.3.5NFS1.3.0主机IPMysql_master192.168.37.108Mysql_slave192.168.37.105NginxPHP192.168.37.103NginxPHP192.168.37.104HAProxyKeepalived192.168.37.101HAPro…

OpenCL “速成”冲刺【第一天】

话说软件开发从来没有速成一说,一门语言你学的越快,说明你在别的语言上下个功夫越多,所以这次加了引号,只不过几周之后可能会有一个公司内部OpenCL的考核,虽然本人不需要考核,不过也正好借机整理下之前Open…

Java8函数式编程

最近使用lambda表达式,感觉使用起来非常舒服,箭头函数极大增强了代码的表达能力。于是决心花点时间深入地去研究一下java8的函数式。 一、lambda表达式 先po一个最经典的例子——线程 public static void main(String[] args) {// Java7new Thread(new R…

电脑如何获得管理员权限

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 我只是记录下,方便以后查看。 参见: https://jingyan.baidu.com/article/ab69b270ff426e2ca6189f54.html

.NET混淆器 Dotfuscator如何保护应用程序?控制流了解一下!

Dotfuscator是一个.NET的Obfuscator。它提供企业级的应用程序保护,大大降低了盗版、知识产权盗窃和篡改的风险。Dotfuscator的分层混淆、加密、水印、自动失效、防调试、防篡改、报警和防御技术,为世界各地成千上万的应用程序提供保护。 Dotfuscator提供…

到底什么才是人生最大的投资

不是房子,不是股票, 是人,跟什么人交往,跟随什么人, 交什么样的朋友,其实就是你投资什么人, 而这,是对人生影响最大的。 钱不会给人机会,房子也不会, 只有人会…

tcpdump抓包命令

目录: 命令格式选项expression表达式示例【命令格式】 man手册显示如下 1 tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]2 [ -c count ]3 [ -C file_size ] [ -G rotate_seconds ] [ -F file ]4 [ -i …

百度Ueditor编辑器wordimage踩坑

背景 改造公司老项目后台编辑器,使用百度的Ueditor做替换。 发现问题 1、ue编辑器初始化后部分参数无法覆盖ueditor.config.js中的选项。2、wordimage(word图片转存)始终是灰色,无法使用。解决办法 1、将ueditor.config.js中的inp…

IntelliJ IDEA 配置JDK

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 IDEA配置JDK 1、点击File -->Project Structure; 2、点击左侧标签页SDKs选项,再点击左上角“”,…

get和post 两种基本请求方式的区别

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出…

无论是工作还是生活都要记住这些话

1.如果你不喜欢现在的工作,要么辞职不干,要么就闭嘴不言。初出茅庐,往往眼高手低,心高气傲,大事做不了,小事不愿做。不要养成挑三拣四的习惯。不要雨天烦打伞,不带伞又怕淋雨,处处表…

苏嵌第一天,shell中一些基础知识

一、常用环境变量 1、HOME变量 Linux系统中的每个用户都有一个相关的称作HOME的目录。 2、PATH变量 包含一列用冒号定界的目录的路径名字,便于可执行程序的搜索。 3、PS1变量 PS1变量包含了shell提示符,$符号 4、LOGNAME变量 包含用户的注册名字…

Java异常处理001:Maven clean package时Failed to clean project: Failed to delete

Java异常处理001:Maven打包时Failed to clean project: Failed to delete 异常日志: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.6.1:clean (default-clean) on project fmk-web: Failed to clean project: Failed …

Weekly Contest 141

做了第一道后,看了下中间两道题目,没怎么看懂就先放着,做完最后一道,然后就没时间了。 1089. Duplicate Zeros Given a fixed length array arr of integers, duplicate each occurrence of zero, shifting the remaining element…

IntelliJ IDEA 中配置、使用 SVN

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1.配置svn 如下图: file -- setting -- version control -- subversion -- 选择 SVN安装路径 -- apply -- OK 2.直接检出…

切记!职场邮件需注意的细节

电子邮件是如今工作场所重要的通信工具之一,但不是每个人都知道如何很好地使用这个工具。工作邮件也是人际沟通的一种方式,和打电话、面谈一样,有很多学问讲究,所以在发送邮件之前一定要深思熟虑。 【发送,抄送&…

李洋疯狂C语言之初

1.sizeof 是看数据类型所占空间大小,这个大小是以 字节(B)为单位 char 是C语言的字符数据类型 %d 用在printf 中表示往屏幕打印一个数字 printf ("char: %d\n", sizeof(char)); 数据类型之间的关系,shor…

时时流量查看工具-ifsta,nload,iftop

为什么80%的码农都做不了架构师?>>> 1、ifstat 是一个网络流量监测程序。能查看网卡的流出和流入的字节. 概要:ifstat就像iostat/vmstat描述其它的系统状况一样,是一个统计网络接口活动状态的工具。 参数: -l 监测环路…