小芝士|简化OpenCL API梳理说明
OpenCL(Open Computing Language,开放计算语言):从软件视角看,它是用于异构平台编程的框架;从规范视角看,它是异构并行计算的行业标准,由Khronos Group来维护。
很多组织会基于OpenCL的规范去维护自己的一套runtime api,比如基于OpenCL3.0的PoCL,我在实现的时候也大多是借鉴这个仓库,他是为了应对CPU和Level Zero GPU目标实现的OpenCL实现,再比如Amd、Intel、Nvdia的硬件平台都有基于OpenCL标准的实现。
我们实验室自己的硬件也需要这样一套基于OpenCL标准的基础api实现。我梳理了一下,需要重点实现的API以及对应功能如下:
基础API说明
对于我们实验室的硬件来说,期望实现的功能主要有:
- 可以面向单platform、单context、多device的异构编程模型;
- 支持单个device拥有多个DDR内存的场景;
- 场景相对单一,因此api设计可以相对简单,不追求完备的OpenCL标准实现,但需要实现满足我们硬件需求的Interface。
API List
为了应对上述场景,需要实现的基础API主要有以下几个:
API名称 | 功能描述 |
---|---|
clGetPlatformIDs | 获取平台ID |
clGetDeviceIDs | 获取设备ID |
clCreateContext | 创建上下文 |
clCreateCommandQueue | 创建命令队列 |
clCreateBuffer | 创建缓冲区 |
clEnqueueWriteBuffer | 写入缓冲区 |
clEnqueueReadBuffer | 读取缓冲区 |
clEnqueueTask | 任务入队 |
clSetKernelArg | 设置内核参数 |
clCreateKernel | 创建内核 |
clReleaseKernel | 释放内核 |
clReleaseMemObject | 释放内存对象 |
clReleaseCommandQueue | 释放命令队列 |
clReleaseContext | 释放上下文 |
clReleaseEvent | 释放事件 |
Datastruct List
原有OpenCL的数据结构很复杂,面对我们的应用场景,可以实现以下的数据结构:
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
还有一些比较基础的cl数据结构,都是以快速实现功能为目的设计。如果是针对下面这种情况则是完全够用。
具体实现
实验室具体代码暂时是闭源的,后续要是可以补充会放上。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!