# 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.