clinfo验证。sudo apt install clinfo
clinfo
clGetPlatformIDs();
clGetDeviceIDs();
clCreateContext();
clCreateCommandQueueWithProperties();
clCreateProgramWithSource();
clBuildProgram();
clCreateKernel();
clCreateBuffer();
clEnqueueWriteBuffer();
clEnqueueNDRangeKernel();
工作组大小影响GPU资源调度和执行效率,注意:
CL_DEVICE_MAX_WORK_GROUP_SIZE,一般为256或512。示例设置:
size_t global_work_size[2] = {1920, 1280};
size_t local_work_size[2] = {16, 16};
| 层级 | 名称 / 特征 | 访问速度 | 容量范围 | 说明 |
|---|---|---|---|---|
| 寄存器 | 每个 Shader Core 独立 | 🚀最快(1cycle) | 十几个~上百个 / Core | 用于 warp/thread 间变量寄存 |
| L0 Cache | 特定类型如纹理缓存(可选) | 很快 | 通常16~64KB | Shader Core 访问纹理时命中 |
| L1 Cache | 各 Shader Core 私有 | 快 | 通常32~64KB | 仅该核心访问,有助于局部性 |
| L2 Cache | 所有 Shader Core 共享 | 中等 | 256KB ~ 1MB(G610) | GPU 内部各核心协同通信关键 |
| 系统主存 | SoC DDR / LPDDR(外部 DRAM) | 最慢(~100ns) | 几 GB ~ 32GB | 与 CPU/NPU/ISP 共享 |
| OpenCL内存类型 | 硬件映射 | 特点 |
|---|---|---|
__private |
寄存器 | 线程私有,访问速度最快,数量有限 |
__local |
L1 Cache / 片上存储 | 同一工作组共享,延迟低,容量有限 |
__global |
系统主存(通过L2缓存) | 共享系统DRAM,延迟高,带宽受限 |
__constant |
L2 Cache专用区域 | 只读缓存区域,适合存储不变数据 |
image2d_t等 |
L0纹理缓存 | 专用缓存优化纹理采样访问 |
__global内存的访问次数,优先使用__local内存做缓存。float4)提升内存访问效率。__kernel void invert(__global uchar *image, const int size) {
int gid = get_global_id(0);
if (gid < size) {
image[gid] = 255 - image[gid];
}
}
size_t maxWorkGroupSize = 0;
clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), &maxWorkGroupSize, nullptr);
printf("Max work group size: %zu\n", maxWorkGroupSize);
RK3588搭载的Mali-G610 MP4 GPU支持OpenCL 2.0,合理利用GPU计算资源,特别是工作组大小和内存层级的优化,是实现高效异构计算的关键。希望这份指导能帮助你快速入门并提升OpenCL应用性能。