OpenCL简介

2009-1-22 作者: 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三个部分:

      • Platform Layer用来管理计算装置,提供启始化装置的界面,并用来建立compute contexts和work-queues。
      • Runtime用来管理资源,并执行程式的kernel
      • 编译器则是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同时被执行的。




<<首页 <上一页  1  2  3  4  下一页>  末页>>  
责任编辑:熊东旭