OpenCL框架¶
OpenCL(Open Computing Language)——开放计算语言,是一种基于 C 语言的并行异构编程模型。OpenCL 的目标是为开发者提供一种统一的编程模型,使得程序员可以专注于算法的实现,而不用考虑底层的并行处理。
异构平台包括了 CPU、GPU、FPGA、DSP 等多个设备。以人工智能的场景举例说明,假如在某个 AI 芯片上跑人脸识别应用,CPU擅长控制,AI processor 擅长计算,软件的flow就可以进行拆分,用CPU来负责控制视频流输入输出前后处理,AI processor 来完成深度学习模型运算完成识别,这就是一个典型的异构处理场景,如果该AI芯片的 SDK 支持 OpenCL,那么上层的软件就可以基于 OpenCL 进行开发了。
OpenCL架构¶
OpenCL 架构,包括了平台模型、内存模型、执行模型、编程模型四个维度。
平台模型¶
OpenCL 平台模型,是指 OpenCL 运行在哪种设备上。OpenCL 平台可以分为主机平台和设备平台。主机平台指的是运行 OpenCL 程序的主机,比如笔记本电脑、台式机、服务器等;设备平台指的是 OpenCL 程序可以运行的设备,比如 CPU、GPU、FPGA、DSP 等。
- 平台模型由一个 host 连接多个 device 组成
- 一个 device 可以由多个 compute unit 组成
- 一个 compute unit 可以包含多个 processing unit
- OpenCL 的应用程序由 host 端和 device 端组成
内存模型¶
OpenCL 内存模型,是指 OpenCL 程序如何访问内存,包含以下几类:
- Host Memory:只能由 host 访问
- Global Memory:设备内存,可以由 Host 和 OpenCL Device访问,允许 Host 的读写操作,也允许 OpenCL Device 中 PE 读写,Host 负责该内存中 Buffer 的分配和释放
- Constant Global Memory:设备内存,允许 Host 进行读写操作,而设备只能进行读操作,用于传输常量数据
- Local Memory:单个 CU 中的本地内存,Host 看不到该区域并无法对其操作,该区域允许内部的 PE 进行读写操作,也可以用于 PE 之间的共享,需要注意同步和并发问题
- Private Memory:PE 的私有内存,Host 和其他 PE 都无法访问
执行模型¶
编程模型¶
在编程模型中,有两部分代码需要编写:Host 端和 device 端。核心是维护一个 context,代表整个 kernel 执行环境。
整个代码的流程如下: