OpenCL简介-----OpenCL学习(一)

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

 

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

 

由于CPU本身适合做逻辑运算,而GPU则适合做“简单暴力运算,所以自然想到利用GPU来进行运算功能,而让CPU主要进行逻辑运算,这个思想最早由NVIDIA公司提出来。

 

现在各种CPUGPU都是支持OpenCL的,OpenCL没有特定的SDKkhronos Group只是制定标准(可以理解为头文件),而具体的实现则是由参与的不同公司自己来实现,所以NVIDIAOpenCL做了实现后集成到了本身的CUDA SDK中,而AMD则是将其实现后放在所谓的AMD APP SDK 中,而intel当然也做了实现,目前主流的CUDAGPU都是支持OpenCL架构的。

 

同时由于不同公司的SDK都遵照OpenCL规范,所以原则上如果你用标准OpenCL中定义的借口的花,使用NVIDIASDK编写的程序是可以在AMD显卡上运行的,不同的SDK可能会针对特定的芯片进行特定的扩展。由于NVIDIA自身有CUDA,所以他与AMDINTEL相比对OpenCL做的扩展会比较少一些。


由于OpenCL ICD的出现,开发人员可以在NVIDIA SDK上编译一个OpenCL标准的程序,然后在AMD硬件上运行,不过,你必须注意OpenCL的版本,如果你在OPenCL 1.2 SDK上编译的程序,在OpenCL 1.1 平台上运行可能会产生一些问题。

 

ICD 的原理是这样的ICDinstallable client driver)允许在同一个系统中安装安装多厂商驱动,这个程序通过ICD layer来访问各个驱动厂商的驱动,详细介绍可以看这里。

http://www.khronos.org/registry/cl/extensions/khr/cl_khr_icd.txt  

 

下面摘抄一点过来

 

    This extension defines a simple mechanism through which the Khronos

    installable client driver loader (ICD Loader) may expose multiple 

    separate vendor installable client drivers (Vendor ICDs) for

    OpenCL.  An application written against the ICD Loader will be able to 

    access all cl_platform_ids exposed by all vendor implementations 

    with the ICD Loader acting as a demultiplexor


ICD loader通过一个结构体参数来推断某个函数是哪一个平台的,这样就可以实现多平台SDK在同一个系统上实现了。

 

并且,你也可以在runtime同时在一个平台上使用以上提到的,包括别的SDK,比如说,你可以使用Intel OpenCL CPU设备同时使用AMD OpenCL GPU设备,他们可以通用的,不过NVIDIA的可能兼容性不太好。因为NVIDIA SDK仅仅支持OpenCL 1.1 标准

 

要注意的是,Intel SDK写出的程序,对NVIDIA AMD Intel 三者的支持可能是最好的。并且,1.2 C++1.1 C++并不是100%兼容的,如果要在NVIDIAAMD GPU上都能使用,那么可以这样 #define CL_USE_DEPRECATED_OPENCL_1_1_APIS

 

所有的不同SDK仅仅是提供给你特定厂商的extesions,所以实际上各个SDK编写出的程序都是可以通用的。Runtime是由特定的硬件厂商,compiler,以及操作系统提供,OpenCL并不是提供runtime的。

 


总结:

 

总之OpenCL是一个跨平台的标准,使用OpenCL,你可以在不同平台上编写能够在别的平台上能够运行的程序。不用过于担心各个OpenCL实现厂商的SDK,在不同SDK中编写的kernels都是可以通用的,除非你用到了这个厂商提供的特定扩展,并且注意OpenCL 1.2 1.1并不是完全兼容的,NVIDIA目前只支持1.1而且NVIDIAOpenCL的支持也不是很好,最好选择AMD或者Intel进行开发。

 

如果想了解关于OpenCL在多平台上运行的信息可以看看这里

http://*.com/questions/14834403/how-to-use-2-opencl-runtimes   

 

http://www.91r.net/ask/15050043.html  

 

knronos官方网站

http://www.khronos.org/  

 

 

OpenCL简介-----OpenCL学习(一)

上一篇:HDU--杭电--4004--The Frog's Games--二分


下一篇:Codeforces Round #228 (Div. 1) 解题报告