OpenCL 入门基础介绍

  2014-04-23 00:00:00 CST

  Jingwen Peng

  OpenCL

OpenCL

在现在这个性能至关重要的年代,OpenCL (Open Computing Language) 可以说是炙手可热。OpenCL 最初由苹果公司开发,拥有其商标权,并在与 AMD、IBM、英特尔 和 nVIDIA 技术团队的合作之下逐步完善。它是一个为异构平台编写程序的框架,此异构平台可由 CPU、GPU 或其他类型的处理器组成,利用多核心实现高性能的并行化计算。

下面说说关于 OpenCL 的基础知识。(以 Mac OS X 平台 为例,当然各个平台都差不多)


概念

在 OpenCL 中,把进行运算的处理器称做 devices (设备)。一个 OpenCL 设备拥有一个或者多个处理 compute units (单元)。一个 workgroup (工作组) 在一个处理单元上执行。一个处理单元又由一个或多个本地处理单元和本地内存组成。

现代的 CPU 通常有两个到八个处理单元,有些 CPU 甚至有更多的处理核心。而图形处理单元 (GPU) 则一般包含很多的处理单元,比如在 Mac 设备上一般有数十个,有些 Mac 设备则包含数百个。对于 OpenCL 来说,这数百个处理单元是相对独立的,各自做各自的运算。OpenCL 把每个 CPU 或者 GPU 看做一个 device。

在 Mac OS X 10.7 及以上版本中实现的 OpenCL API 中支持使用 CPU 或者 GPU 进行数据的并行化处理。在 OpenCL 程序中,那些需要 重复地、相对独立地、并行地 执行的代码被称作 kernel (核心),每一个计算工作被称为 work item (工作项),每个工作项都被分配一个 ID,工作 ID 最多支持三个维度(称为 N-D range)。比如要分别对一万个字符串计算 MD5 值,每个字符串计算 MD5 值这项工作是相互独立地,而且可以并行化执行,那么计算 MD5 值这段代码就被称为 kernel,同时每个计算工作就是一个 work item。

一个 kernel 就是一个用 OpenCL 语言编写地函数。它可以在任何支持 OpenCL 的设备上执行。kernel 不同于一般而言的函数,因为当你调用一次 kernel,会有很多的 kernel 执行实例同时并且相对独立地运行。

调用 kernel 函数地程序被称作 host application (宿主程序),运行宿主程序的设备被称为 host device (宿主设备)。host application 要做的是设置 OpenCL 执行的上下文、创建执行队列 还有 将 kernel 入队。在 Mac OS X 中,host application 执行在 CPU 上,在它调用 kernel 之前,需要做以下工作:

  1. 检查 host device 上有哪些 OpenCL device 可用
  2. 选择 host application 要使用的 OpenCL device
  3. 为将要使用的 device 创建执行队列
  4. 申请 kernel 执行所需要的内存对象

host application 申请的内存对象可以被 kernel 访问, memory objects (内存对象) 用来操作设备内存。在 OpenCL 中有两种内存对象可供使用:buffer objects (缓冲对象) 和 image objects (图像对象)。buffer objects 可以用来存放任何类型的数据,而 image objects 只能包含用特定格式以像素组织的图像。

用来让 kernel 入队并执行的 host application 可以使用 C、C++ 或 Objective-C 编写。编译器在编译 kernel 的时候将为其目标平台尽可能地进行性能优化。kernel 写在单独的文件中,也可以嵌入到 host application 的代码中。

OpenCL kernel 可以通过以下方式执行:

  1. 编译时编译,运行时由 host application 调用
  2. 运行时编译并被 host application 调用
  3. 从已经编译好的库中调用

开发流程

OpenCL 的开发流程大概分以下几个主要步骤:

Process

  1. 确认哪些工作可以被并行化处理
  2. 编写用于并行计算的 kernel 函数
  3. 编写可以调用 kernel 的 host application
  4. 编译
  5. 执行
  6. 调试
  7. 进一步提高性能

说到这里,有关 OpenCL 的基础知识就讲的差不多了,有了基础知识才能做进一步的开发。当你遇到需要利用并行化计算以达到高性能的程序时,不妨试试 OpenCL。

如果您有疑问或建议,请在下方评论区域留言

遵循 BY-NC-ND 协议

评论功能加载中...