OpenCL简介

作者: Heresy

来源: Heresy's Space

关键字: OPenCL CUDA Quadro 
  时间刚好是Siggraph08,所以最近一堆电脑绘图方面的东西都出来了。像前几天的nVidia的GeForce Force Within、OpenGL 3.0的ForceWare 177.89、ATI的4850x2和4870x2,以及Intel的Larrabee,都算最近Siggraph的东西吧~

  而虽然不见得和图学有关,但是GPGPU最近也是Siggraph的一个热门话题;像是ATi的CTM、nVidia的CUDA,就是这两家处理器大厂各自推出的GPGPU开发方案。不过,日前也有提过,已经有在规画一个称做OpenCL(Open Computing Language,开放计算语言)的标准了~由于nVidia、AMD、Intel等相关公司都在其列,或许以后有可能OpenCL会像是GLSL或HLSL一样,成为多核心程式的一个共通标准?而日前也有消息指出,AMD似乎有意放弃CTM而以OpenCL为主(参考《AMD ditches Close-To-Metal, focuses on DX11 and OpenCL》)。 (话说,微软没有参予OpenCL。不知道是不是打算以DirectX 11的Compute Shader来吃这块市场呢?)

  但是,OpenCL的标准似乎也都还没有什么细节可以参考,也不知道到底会是怎样?不过前几天,在Siggraph 08的Class里「Beyond Programmable Shading: Fundamentals」,到是出现了OpenCL的简单的范例程式,可以让大家一窥究竟了~

  这个class的投影片,可以在http://s08.idav.ucdavis.edu/找到。其中除了OpenCL外,也包含了其他CUDA、AMD Stream SDK、Larrabee、DirectX 11 Compute Shader等等的各种GPU计算的资料。不过,还是先根据OpenCL的投影片,来看看他的程式架构吧~

  投影片的标题当然是OpenCL,副标题则是「Parallel Computing on the GPU and CPU」,代表了他不只是GPGPU的程式语言,也还可以用在CPU上!而OpenCL设计的目的,除了是键立一个标准外,主要是希望可以:

  • 用平易近人的语言,使用不同的计算支援
  • 能够在单一或多个处理器上平行进行
  • GPU、CPU、GPU + CPU或多GPU
  • 桌上型和手持装置

设计成可以和图型API(如OpenGL)一起运作
  而OpenCL也是基于C的一个程式语言,在软体上,分为Platform. Layer、Runtime、Compiler三个部分:
1.Platform. Layer用来管理计算装置,提供启始化装置的界面,并用来建立compute contexts和work-queues。
2.Runtime用来管理资源,并执行程式的kernel
3.编译器则是ISO C99的子集合,并加上了OpenCL特殊的语法。
  在OpenCL的执行模型中,有所谓的Compute Kernel和Compute Program。 Compute Kernel基本上类似于CUDA定义的kernel,是最基本的的计算单元;而Compute Program则是Compute Kernel和内建函式的集合,类似一个动态函式库(看不懂什么意思…)。而应用程式则是会把要执行的compute kernel排序,在执行时则可以依序或不依照顺序来执行。

  在平行计算方面,有data-parallel和task-parallel两种不同的计算模型。其中,data-parallel的模式,就是CUDA的平行化的形式,这也是所有OpenCL计算装置都必须要支援的!相较之下,task-parallel模式,则比较接近一般在写CPU程式的threading了~这个模式,应该也不是所有装置都会支援。

  Data-Parallel Execution Model

  在data-parallel的模型,定义了「N-Dimensional computation domain」(后面缩写成「ND domain」)。在这个ND domain中,每一个独立的项目,被称做一个「work-item」(相当于CUDA的thread),全部的work-item数量,则被定义为「global work size」。

  每一个work-item会被平行地执行,同时也可以把几个work-item作群组,成为「work-group」(相当于CUDA的thread block);而在work-group中的work-item可以互相沟通,也可以进行同步(synchronize)。而在OpenCL中,也是多个work-gorup同时被执行的。

Task-Parallel Execution Model

  在文章中是说,某些计算装置,像是CPU,也可以执行task-parallel的compute kernell。而在OpenCL的这个模式下,就是执行单一个work-item了~
 
  记忆体模型

  而在OpenCL的记忆体模型方面,和CUDA一样,分为很多种记忆体空间;不过,OpenCL应该是没有CUDA的shared memory和texture memory了。

 

  在OpenCL里的记忆体空间有private memory、local memory、constant memory和global memory四种;架构上大概是像右边的图一样。不过由于这部分也就只有一张投影片,所以有的部分,也不是很清楚就是了。

  上面都算是架构的东西,接下来,就是OpenCL语言的部分了~

OpenCL基本上是源自ISO C99的标准,和CUDA一样,主要是针对kernel程式的部分而开发的。在这部分,一样有加上一些限制,比如说recursion、function pointers都不能在kernel里使用。

  而除了标准C的语法外,OpenCL也另外加上了一些其他的东西。

  第一种就是指定记忆体使用的记忆体空间的四个qualifier(__private、__local、__constant、__global)(虽然投影片没提及,但实际上应该还有指定函式的qualifier?)。

  第二种则是内建的资料型别。像是纯量、向量和影像(image2d_t、image3d_t、sampler_t)的相关型别,以及基本的型别转换函式。

  第三种则是其他内建的函数。在投影片中,OpenCL把这些函数分成必要的(Required)和选择性的(Optional)两种。必要的函式包括了:

 
 
work-item functions
math.h
read and write image
relational
geometric functions
synchronization functions
  而选择性的,则有:

 
 
double precision
atomics to global and local memory
selection of rounding mode
writes to image3d_t surface
  不过呢,在投影片也就只供这些资料了。究竟有哪些东西呢?细节部分,大概要等到详细的文件出来吧?不过,目前Heresy完全找不到其他的相关资料就是了…(连软体都没有,也没的试了)

  而在接下来的投影片,则是提供了一份用OpenCL写的FFT的范例程式;和CUDA一样,分为Host code和Compute kernel两部分。

  下面就是Host Code的部分:

 

看了上面的程式,Heresy个人的感觉是比CUDA来得更为繁琐…而且光就投影片来说,Heresy很多地方还是没能清楚;像是「fft1D_1024_kernel_src」就没有在投影片中出现他的相关资讯。

  而Compute Kernel的部分,则是:

 

  基本上,这边就更惨了…在没有文件的情况下,Heresy也无法分辨哪些函式是OpenCL内建的(还是其实都是?)…所以,看看就好吧~

  到这,主要就是这份OpenCL投影片的资料了~说实话,资料时在不够,只能大概做些参考。真的要下去玩,应该要等到有软体、有完整的程式可以下载安装了。而之前有提过,OpenCL可能是CUDA的子集合,不过在Heresy看来,在概念上基本上可以这样说,可是在程式开发上,应该还是会有相当的差异。至于如果OpenCL这个标准化的东西起来后,对于CUDA会有多大的影响呢?这点应该会是Heresy比较好奇的。

fj.png128770581062812500.jpg

fj.png1.jpg

fj.png2.jpg

fj.png128770581062812500.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22785983/viewspace-619547/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22785983/viewspace-619547/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值