Apple's OpenCL——概述
http://www.cocoachina.com/bbs/read.php?tid-31196.html
OpenCL是由Apple公司起草设计的用于大规模并行计算的计算编程语言,并于2008年6月提交给KHRONOS开放标准组织,并在当年的12月由该组织release了第一版。
OpenCL即:Open Computing Language
下面将简单地为大家介绍OpenCL的特征以及一些基本概念和术语。
OpenCL的设计要求:
一、使用系统中所有计算资源:
1、将CPU、GPU以及其它处理器进行统一编程
2、同时支持数据以及任务并行计算模型
二、基于高效C的并行编程模型:
抽象了底层硬件的细节
三、在嵌入式、桌面、服务器系统范围内的可实现性
四、驱动未来硬件要求:
1、浮点精度要求
2、可同时应用于消费者以及HPC(高性能计算)应用
模型层级:
OpenCL分为四个模型层级:平台模型、存储器模型、执行模型以及编程模型。
OpenCL平台模型:一台主机+一台或多台计算设备
- 每个计算设备由一个或多个“计算单元”组成
- 每个计算单元被进一步划分为一个或多个“处理元素”
OpenCL执行模型:
1、OpenCL程序:
- 内核:可执行代码的基本单元——类似于一个C函数; 数据并行或任务并行
- 主机程序:计算内核及内部函数的集合; 类似于一个动态库
2、内核执行:
- 主机程序在一个被称为NDRange的一个索引空间调用内核
- NDRange = “N维范围”
- NDRange可以是1,2或3维空间
- 在索引空间中一个点上的一单个内核实例被称为一个“工作项”
- 工作项具有来自索引空间唯一的全局ID
- 工作项被进一步组成“工作组”
- 工作组有一个唯一的工作组ID
- 工作项在一个工作组内有一个唯一的局部ID
3、上下文和队列:
上下文被用于包含并管理“世界”的状态
内核在所定义的上下文中执行,并被主机操作
- 设备
- 内核——OpenCL函数
- 程序对象——内核源代码以及可执行代码
- 存储器对象
命令队列——协调内核执行
- 内核执行命令
- 存储器命令——存储器对象数据的传输或映射
- 同步命令——限制命令的次序
应用程序队列计算内核执行实例
- 被顺序排队
- 被有序或无序执行
- 事件被用于实现执行实例的适当的同步
OpenCL存储器模型
共享的存储器模型
- 松弛的一致性
多个不同的地址空间
- 地址空间可以被分割,根据设备的存储器子系统
地址空间
- 私有——对一个工作项私有
- 局部——对一个工作组局部
- 全局——可被所有工作组中的所有工作项访问
- 常量——只读全局空间
实现映射该层级
- 对可用的物理存储器
存储器一致性:
“OpenCL使用了一个松弛的一致性存储器模型;即对一个工作项可见的存储器的状态不能保证一直对工作项集的一致性”
在一个工作项内,存储器有加载/存储一致性
在一个工作组内,一个栅栏上,局部存储器具有对该工作组中的工作项的一致性
全局存储器在一个工作组内具有一致性,在一个栅栏上,但不能保证跨不同工作组
在命令之间共享的存储器的一致性通过同步被强制。
数据并行编程模型
定义N维计算域
- 在一个N维域中的每个独立的执行元素被称为一个工作项
- N维域定义了并行执行的工作项的总数,即等于全局工作大小
工作项可以被组合在一起——工作组
- 一个工作组中的所有工作项可以相互通信
- 可以在工作组中的工作项之间进行同步以协调存储器访问
并行执行多个工作组
将全局工作大小映射到工作组可以是隐式或显式的。
任务并行编程模型
数据并行执行模型必须被所有OpenCL计算设备实现
一些计算设备,诸如CPU也可以执行任务并行计算内核
-作为一单个工作项执行
- 用OpenCL写的一个计算内核
- 一个本地C/C++函数
OpenCL的官方网站:http://www.khronos.org/opencl/
另外,各位也可以参考Apple的OpenCL资料
需要注意的是,OpenCL目前只能在Snow Leopard系统上跑,Leopard没有OpenCL驱动。
下面附上一个OpenCL设备查询程序。偶花了两个晚上的时间整理出来的,呵呵。
这个工具也能大致体现你当前CPU以及GPU的处理能力。