# third_party_opencl-icd-loader
**Repository Path**: lengyang3/third_party_opencl-icd-loader
## Basic Information
- **Project Name**: third_party_opencl-icd-loader
- **Description**: KhronosGroup OpenCL ICD Loader 用于提供加载不同OpenCL驱动的接口层。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://gitee.com/openharmony-sig/third_party_opencl-icd-loader
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2023-12-18
- **Last Updated**: 2023-12-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# OpenCLTM ICD Loader
此仓库包含Khronos官方OpenCL ICD Loader的源代码和测试代码。
## 引言
OpenCL定义了*Installable Client Driver*(ICD)机制,允许开发人员根据ICD-Loader构建OpenCL应用程序,而不是链接特定的OpenCL驱动实现。
ICD 加载程序负责:
* 导出OpenCL API符号信息
* 枚举所有支持ICD Loader扩展OpenCL驱动
* 将OpenCL API调用转发到正确的驱动实现
此仓库包含Khronos官方OpenCL ICD Loader的源代码和测试代码。
请注意,此仓库仅包含OpenCL加载程序,但不包含OpenCL具体驱动实现。
您需要为支持OpenCL ICD扩展(`cl_khr_icd`)的OpenCL设备获取并安装OpenCL驱动实现,才能使用OpenCL ICD Loader运行OpenCL应用程序。
OpenCL扩展规范中描述了OpenCL可安装客户端驱动程序扩展(`cl_khr_icd`),该规范可在[Khronos OpenCL注册表](https://www.khronos.org/registry/OpenCL/)中找到。
## 场景介绍
OpenCL是一个为异构平台编写程序的框架,此异构平台可由CPU,GPU或其他类型的处理器组成。OpenCL由一门用于编写kernels(在OpenCL设备上运行的函数)的语言(基于C99)和一组用于定义并控制平台的API组成。OpenCL提供了基于任务分割和数据分割的并行计算机制。
在OpenHarmony,OpenCL-ICD-Loader作为各OpenCL实现在系统组件的接口层,可以为其他组件提供统一的OpenCL应用的构建依赖,同时ICD-Loader负责对接芯片组件的驱动实现,可以枚举出当前平台上所有支持ICD扩展的OpenCL设备(如GPU)。
OpenCL在图形图像处理,音视频编解码、NN模型推理等领域具有非常重要的应用价值,开发者可以充分利用GPU等设备的并行计算能力,显著提升后处理算法的性能。
## 构建指导
OpenCL-ICD-Loader依赖OpenCL-Headers,关于OpenCL-Headers的具体介绍详见:https://gitee.com/openharmony/third_party_opencl-headers
1、OpenCL-Headers依赖
OpenCL-ICD-Loader组件已经通过`public_deps`包含了对OpenCL Header的依赖,您可以直接依赖OpenCL-ICD-Loader组件,无需单独依赖OpenCL-Header
```
public_deps = [ "//third_party/opencl-headers:opencl_headers" ]
```
2、添加对OpenCL-ICD-Loader的依赖
OpenCL-ICD-Loader提供了`inner_kis`接口,您可以通过如下方式添加依赖
```
external_deps = [ "opencl-icd-loader:libopencl" ]
```
同时您需要在组件的bundle.json中添加deps申明
```
"deps": {
"components": [
"opencl-icd-loader"
]
}
```
3、OpenCL API使用
您在正确设置对OpenCL-ICD-Loader的依赖后,只需要在代码中包含对应的头文件,即可直接调用OpenCL的正式API,Loader本身无需任何初始化处理。
一个简单的OpenCL程序如下:
```
#include //注意,OpenCL头文件路径需要按照CL/*.h的格式包含
cl_platform_id platform_id;
cl_device_id device_id;
cl_int err = clGetPlatformIDs(1, &platform_id, NULL);
if (err != CL_SUCCESS) {
return err;
}
err = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
if (err != CL_SUCCESS) {
return err;
}
cl_context context = clCreateContext(0, 1, &device_id, NULL, NULL, &err);
if (context == NULL || err != CL_SUCCESS) {
return err;
}
cl_command_queue queue = clCreateCommandQueueWithProperties(context, device_id, 0, &err);
if (queue == NULL || err != CL_SUCCESS) {
return err;
}
cl_program program = clCreateProgramWithSource(context, 1, &program_source, NULL, &err);
if (program == NULL || err != CL_SUCCESS) {
return err;
}
cl_kernel kernel = clCreateKernel(program, "kernel_name", &err);
if (kernel == NULL || err != CL_SUCCESS) {
return err;
}
// set arg to kernel
...
err = clEnqueueNDRangeKernel(queue, kernel, work_dim, NULL, global, local, 0, NULL, NULL);
if (err != CL_SUCCESS) {
return err;
}
clFinish(queue);
// release all opencl object
...
```
## OpenCL使用文档
[API官方文档](https://registry.khronos.org/OpenCL/)
[API详细定义](https://registry.khronos.org/OpenCL/sdk/3.0/docs/man/html/)
[API一张图的使用说明](https://www.khronos.org/files/opencl30-reference-guide.pdf)
## License
见 [LICENSE](LICENSE).
---
OpenCL and the OpenCL logo are trademarks of Apple Inc. used by permission by Khronos.