OpenCL(Open Computing Language)是由Apple发起,由Khronos负责起草的用于跨平台并行计算的工业标准。基于该标准,我们可以使用任何系统中支持该标准的计算资源。由于该标准支持不同的编程语言、不同的硬件设备并且高效,因此可能成为软件、中间件乃至使用高性能计算设备厂商的有效解决方案。
![]()
OpenCL包含了四种模型:系统模型(Platform Model),执行模型(Execution Model),内存模型(Memory Model)和编程模型(Programming Model)。其中前三个模型与CUDA及其相似,几乎就是CUDA的翻版,只不过改了一些专有名词的称呼。而在编程模型中,分为数据并行(Data Parallel)和任务并行(Task Parallel)模型两种。数据并行是和CUDA执行类似,所有线程中执行的内核(kernel)是相同的,只是处理的数据会根据内核代码分支等原因而不同。任务并行则在每个线程中执行不同的代码,类似于目前CPU中的多线程编程模型,估计这是和Intel博弈的结果,因为Larrabee将来是个多CPU的结构。具体的信息可参考OpenCL设计说明。
在程序中使用OpenCL编程大致可分为6个步骤:
- 查找支持OpenCL的硬件设备(Device),并创建上下文(Context)
- 创建命令队列(Command Queue)及包含了内核的程序(Program);如果该程序是源代码,则还需进行在线编译。
- 创建程序执行过程中需要的内存对象(Buffer)及图像对象(Image Object),并初始化
- 创建内核对象(可理解为Kernel中的函数)并设置其所需参数
- 设置内核的索引空间(NDRange)并执行内核。其中NDRange通过全局尺寸(GlobalSize)和工作包尺寸(WorkGroup)来进行管理。
- 将运行的结果拷贝回主机(Host)内存。
当然,还有重要的步骤是内核设计,OpenCL的内核代码是C语言,只是增加了一些扩展和限制。
OpenCL VS. CUDA Drv.
| OpenCL | CUDA Drv. | |
| Platform
Layer |
clCreateContext | cuCtxCreate |
| Program | clCreateProgramWithSource
clBuildProgram |
cuModuleLoad |
| Kernel Function | clCreateKernel | cuModuleGetFunction |
| Parameter | clSetKernelArg | cuParamSet |
| Command Queue | clCreateCommandQueue | — |
| Grid | clEnqueueNDRangeKernel | cuFuncSetBlockShape cuLaunchGrid |
| Memory | clEnqueueReadBuffer | cuMemcpyDtoH |
可见,所有OpenCL的操作,在CUDA中都可以找到它的影子。为什么?估计是因为OpenCL的WorkGroup主席是NVIDIA的副总裁Neil Trevett.
所以如果你熟悉cuda,那么很容易上手OpenCL. 并且从目前已经发布的NVIDIA和AMD的sdk中也有例子,可以用来学习。
OpenCL中相对于CUDA增加了几个新的概念:
1、命令队列:内存管理命令,内核执行命令,强制同步命令(Synchronization)等命令将被按照调用的顺序先后放入该队列中。命令队列有两种执行方式:
a.同步执行(In-order):所有命令均等待前面的命令执行完毕返回后才执行。
b.异步执行(Out-of-order):所有的命令均直接执行,并不等待前序命令执行完毕。该模式需要程序员自己管理同步。
2、事件(Events):内核和内存命令在加载到命令队列时,会产生一个事件对象(Event Object),可以用来管理队列的执行。
3、图像对象(Image Object):特殊的内存对象,可以为1、2、3维度。它类似于GPU中的纹理对象(Texture Object),但是OpenCL的图像对象可以选择性支持写操作(clEnqueueWriteImage),这取决于硬件厂家的实现。
另外,类似于OpenGL,OpenCL支持扩展功能(clGetExtensionFunctionAddress),各个厂家可用此提供专有的扩展功能,以保持其先进性。
本文简单介绍了OpenCL的框架结构,有兴趣的读者可以到相关网站做进一步的了解.


Opencl教程系列…
一,概述
二,基本概念
三,简单的demo
四,存储模型
……