Opencl是一种典型的异构架构,可以很好的实施并发性,为了简化并行计算复杂度以及兼容各个芯片差异性,opencl将其抽象为四大模型(Platform model, Execution model,Memory model 以及Programming model),它是整个opencl的基础部分。可以说 opencl很好的兼容CPU,GPU和DSP fpga等芯片。

最近几十年并行计算发展一直处于不稳不火的状态,主要有以下几点:

1:摩尔定律的发展,芯片性能,每隔几年都有大的提升,直接升级硬件带来的收益远远大于软件优化的收益,使各个厂商没有兴趣进行并进计算的优化

2:并行编程是软件的复杂性大大提高,与传统串行编程思路相比复杂度较高。

3:一直缺乏有效统一的并行编程的架构,各个厂商为了自己的利益,开发自己的平台,将广大开发人员绑定在自己架构指示,如英伟达 开发出的CUDA,因其在GPU上的优势,绑定了广大开发者,目前大部分的开源库都支持CUDA。

Opencl最早由苹果开发设计,其他厂商也慢慢加入进来,最后交由khronos进行后续开发维护,它是API级的并行计算架构,而CUDA偏向与整个系统基本的,两种稍微不同。Opencl良好的兼容各个CPU,GPU等芯片架构,所以得到了芯片厂商的大力支持,如果Opencl在今后几年不能进行并行计算的大统一,广大开发者等到新的架构下次大统一估计是十年之后的事情。最近,几年随着AI发展,国内出现的大批AI芯片公司,想进行弯道超车一举转变我国在芯片的劣势,也为opencl发展提供了新的机会。

当然Opencl也有相应的缺点,它属于API级的架构,就注定了其开发复杂度,在当今Java,Python当道的情况下(尤其是"Life is short. I use Python" ,这句话被广大py 当做神句,其实国内已经误解其原作者意思,py也只是工具,当初作者写这句话意思只是想说明 使用py开发的方便之处,只是当做工具来使用,其实语言就是工具,国内环境对编程语言太过强调,反而丢弃计算机本质),社会浮躁情况下,很少有人愿意去研究底层,国内缺少opencl方面的人才,当然和国内目前招聘opencl职位较少也有关系。

Opecl API最早期指提供了C接口,后来为了简化其操作复杂性,尤其是使用C接口很容易忘记释放内存,造成内存泄漏,后来提供C++接口,极大简化了其操作复杂性。

Platform Model 

platform model是认识opencl基础,也对了解异构计算也有很大好处,它是实现对硬件层的抽象,如图下:

process model15解读 processor model_process model15解读

上述图片来自于《Opencl Programming Guide》 一书,opencl平台分为Host 和 Device 两个部分:

HOST :host仅仅只有一个,一般是在CPU上,host会链接到多个device上。主要功能为:

             1:初始化opencl,创建conetxt等等一系列操作

             2:  可以和应用程序进行交互,将应用程序的数据 copy到 device上

            3:向device 提交命令

            4:将device的计算结果 copy到host上。

            5:host通过创建context来实现与device的交互,进一步控制devide

Device: device设备可以为多个,可以是GPU,CPU或者DSP,它是计算的主力,所有算法都是在device计算的,所以devide大小,多少代表了有多少计算能力

           1: device 上的代码一般称为kernel。

           2:一个device又可以进一步分为多个CU(compute units), 一个CU又可以分为多个PE(processing element).

          3:  PE是真正的执行单元。

Platform model最主要的作用是将各种硬件设备抽象成了统一一个模型平台,为后面opencl的框架实施打好了基础,同时也能很好的兼容各种类型的设备

参考资料

《OpenCL programming Guide》