原文地址:http://coderdock.com
OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准。
1.是什么
OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准。
有标准,就得有实现,目前而言,intel、Nvidia、ARM、AMD、QUALCOMM、Apple都有其对应的OpenCL实现。在这个系列中,我们着眼于OpenCL的语法以及编程概念。不去深究各家实现的异同。
我所使用的Nvidia的实现。在我的电脑上,显卡是 GTX-960M,去Nvidia官网下载相应的cuda-tool-kit进行安装,以及使用命令行安装sudo apt-get install nvidia-opencl-dev nvidia-opencl-icd-xxx
(xxx是与你的发行版本相对应的版本号,我的是384)。详细安装过程不再赘述。
- 异构:什么是异构,最简单的X86和ARM就是最明显的处理器架构,标准中说面向异构,那么也就是说只需要编写一次代码,就能够在不能的架构芯片上运行(功能怎么有点像JAVA)。
- 并行: 我们总是希望能够有性能更高的的计算机。提高性能的方法之一是提高运行频率,不过现在各家的CPU在4GHZ都卡了脖子。另外一种方式就是,把任务分发出去,让不同的处理核心去进行。但如果处理不好,就成了简单的堆砌核心,形成
一核有难,七核围观
的尴尬局面。所有有的专家就经过研究后提出了增加专门的处理单元,来提取异构单元中的每个并行项,是提升功率效率的唯一方法
。我对这句话的理解就是农夫种田,渔民打鱼
,把合适的任务交给合适的处理单元来做,CPU处理控制,GPU处理大量简单的运算。所以此处的并行就是指能够提取并行项,并正确处理
的意思。 - 通用:既然说每一种架构都有其适合的处理任务类型,难道我要去学每一种架构的编程语言么,非也,这就是OpenCL做的事情。它向上提供统一的编程接口,下面的具体实现由各个厂商去实习。
2.学什么
- 掌握所开发的异构系统的组成,(X86还是ARM总的分清吧,有几个核总得知道吧)
- 掌握这些设备的属性(最简单的CPU擅长逻辑,GPU擅长简单运算)。
- 使用合适的处理方式(任务并行或数据并行或两者兼有之)将任务进行分解,转化为具体架构平台上的指令(也称为内核)
- 建立用于计算的数据结构和内存对象
- 按照既定的顺序执行内核
- 核验结果
3.组成
- 平台模型: 可以理解为我们所用的主机,该主机可能包含多个OpenCL设备(CPU GPU),每一个设备可能包含多个计算单元(CU),每一个计算单元又可能包含多个处理单元。
- 执行模型: OpenCL执行程序时,在主机上执行控制程序,分发内核(执行程序)到多个处理设备。
- 存储模型:根据实际的存储体系,OpenCL将内部存储器抽象成四层结构的存储器模型:全局内存、常量内存、本地内存、私有内存。
- 编程模型:数据并行、任务并行、二者混合。
这一部分我们会在下一篇中进行详细解释。