[转]OpenCL简介

来源:互联网 发布:java 取绝对值 编辑:程序博客网 时间:2024/06/11 02:51

转自:http://nvidia.e-works.net.cn/document/200901/article7405.htm

 

时间刚好是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同时被执行的。

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比较好奇的。

原创粉丝点击