OpenCL(Open Computing Language)是一种用于 CPU、GPU、DSP、FPGA 等异构平台并行编程的框架。本文将介绍 OpenCL 的基本语法和程序结构,帮助你快速入门。
cl_platform_id platform;
cl_device_id device;
cl_context context;
cl_command_queue queue;
cl_program program;
cl_kernel kernel;
clGetPlatformIDs(...);
clGetDeviceIDs(...);
clCreateContext(...);
clCreateCommandQueue(...);
clCreateProgramWithSource(...);
clBuildProgram(...);
clCreateKernel(...);
__kernel void add(__global const float* a,
__global const float* b,
__global float* result)
{
int id = get_global_id(0);
result[id] = a[id] + b[id];
}
| 修饰符 | 说明 |
|---|---|
| __global | 全局内存 |
| __local | 工作组共享内存 |
| __private | 每个线程私有内存 |
| __constant | 只读常量内存 |
| 函数 | 功能 |
|---|---|
| get_global_id(i) | 获取全局 ID(线程唯一标识) |
| get_local_id(i) | 获取局部 ID(组内线程索引) |
| get_group_id(i) | 获取工作组 ID |
| get_global_size(i) | 全局线程数 |
| get_local_size(i) | 每个工作组线程数 |
用于协调工作组内的线程执行:
barrier(CLK_LOCAL_MEM_FENCE);
int, float, doublefloat4, uchar16, int2 等sqrt(), dot(), cross(), fmax()cl_mem bufA = clCreateBuffer(context, CL_MEM_READ_ONLY, size, NULL, NULL);
clEnqueueWriteBuffer(queue, bufA, CL_TRUE, 0, size, host_data, 0, NULL, NULL);
clSetKernelArg(kernel, 0, sizeof(cl_mem), &bufA);
size_t global_work_size = 1024;
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global_work_size, NULL, 0, NULL, NULL);
if (err != CL_SUCCESS) {
printf("OpenCL Error: %d\n", err);
}
clReleaseMemObject(bufA);
clReleaseKernel(kernel);
clReleaseProgram(program);
clReleaseCommandQueue(queue);
clReleaseContext(context);
[Host 端 (CPU)] └─ 创建 Context / Queue / Program / Kernel └─ 分配内存、传数据 └─ 启动 Kernel [Device 端 (GPU)] └─ 执行 __kernel 函数 └─ 并行调用 get_global_id() 等函数
提示:学习 OpenCL 的最佳方式是配合实际平台(如 Intel、AMD、NVIDIA、ARM)的 SDK 示例进行调试和实验。