小芝士|简化OpenCL API梳理说明

OpenCL(Open Computing Language,开放计算语言):从软件视角看,它是用于异构平台编程的框架;从规范视角看,它是异构并行计算的行业标准,由Khronos Group来维护。

image-20250413203220258

很多组织会基于OpenCL的规范去维护自己的一套runtime api,比如基于OpenCL3.0的PoCL,我在实现的时候也大多是借鉴这个仓库,他是为了应对CPU和Level Zero GPU目标实现的OpenCL实现,再比如Amd、Intel、Nvdia的硬件平台都有基于OpenCL标准的实现。

image-20250413203239113

我们实验室自己的硬件也需要这样一套基于OpenCL标准的基础api实现。我梳理了一下,需要重点实现的API以及对应功能如下:

基础API说明

对于我们实验室的硬件来说,期望实现的功能主要有:

  1. 可以面向单platform、单context、多device的异构编程模型;
  2. 支持单个device拥有多个DDR内存的场景;
  3. 场景相对单一,因此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
2
3
4
cl_context{
cl_device_id* devices;
unsigned int num_devices;
}
1
2
3
4
5
cl_device_id{
cl_device_type device_type;
cl_ulong global_mem_size;
void *data;
}
1
2
3
4
5
6
cl_command_queue{
cl_context context;
cl_device_id device;
cl_command_queue_properties properties;
cl_event event;
}
1
2
3
4
5
6
7
cl_mem{
cl_context context;
size_t size;
void* mem_ptr;
u64 mem_addr;
void *data;
}
1
2
3
4
5
cl_kernel{
cl_context context;
cl_program program;
const char* name;
}

还有一些比较基础的cl数据结构,都是以快速实现功能为目的设计。如果是针对下面这种情况则是完全够用。

image-20250413204118276

具体实现

实验室具体代码暂时是闭源的,后续要是可以补充会放上。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!