核心对象与属性
对象/属性 |
描述 |
示例 |
cl_platform_id |
表示OpenCL平台 |
clGetPlatformIDs(1, &platform, NULL) |
cl_device_id |
表示计算设备 |
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL) |
cl_context |
管理设备、内存和命令队列的上下文 |
clCreateContext(NULL, 1, &device, NULL, NULL, &context) |
cl_command_queue |
命令队列,用于提交命令 |
clCreateCommandQueue(context, device, 0, &queue) |
cl_program |
OpenCL程序对象 |
clCreateProgramWithSource(context, 1, &source, NULL, &program) |
cl_kernel |
内核函数对象 |
clCreateKernel(program, "kernel_name", &kernel) |
cl_mem |
内存缓冲区对象 |
clCreateBuffer(context, flags, size, host_ptr, &err) |
image1d_t/image2d_t/image3d_t |
图像对象 |
|
pipe |
管道对象 |
|
cl_platform_id属性与函数
平台信息查询函数
函数 |
描述 |
参数说明 |
返回值 |
clGetPlatformInfo |
获取平台信息 |
platform : 平台ID param_name : 查询参数 param_value_size : 缓冲区大小 param_value : 返回数据 param_value_size_ret : 实际数据大小 |
cl_int 错误码 |
平台属性查询参数
查询参数 |
描述 |
返回类型 |
CL_PLATFORM_PROFILE |
平台支持的OpenCL规范 |
char[] (如"FULL_PROFILE") |
CL_PLATFORM_VERSION |
OpenCL版本信息 |
char[] (如"OpenCL 3.0") |
CL_PLATFORM_NAME |
平台名称 |
char[] (如"NVIDIA CUDA") |
CL_PLATFORM_VENDOR |
平台供应商 |
char[] (如"NVIDIA Corporation") |
CL_PLATFORM_EXTENSIONS |
支持的扩展列表 |
char[] (空格分隔) |
CL_PLATFORM_HOST_TIMER_RESOLUTION |
主机计时器分辨率(OpenCL 2.1+) |
cl_ulong |
CL_PLATFORM_ICD_SUFFIX_KHR |
ICD后缀(需要cl_khr_icd 扩展) |
char[] |
平台相关函数
函数 |
描述 |
参数说明 |
返回值 |
clGetPlatformIDs |
获取可用平台列表 |
num_entries : 最大平台数 platforms : 平台ID数组 num_platforms : 实际平台数 |
cl_int 错误码 |
clGetDeviceIDs |
获取平台关联的设备 |
platform : 平台ID device_type : 设备类型 num_entries : 最大设备数 devices : 设备ID数组 num_devices : 实际设备数 |
cl_int 错误码 |
clUnloadPlatformCompiler |
卸载平台编译器资源 |
platform : 平台ID |
cl_int 错误码 |
扩展函数 (需要相应扩展支持)
函数 |
描述 |
扩展要求 |
clGetPlatformInfoKHR |
获取扩展平台信息 |
cl_khr_icd |
clIcdGetPlatformIDsKHR |
ICD扩展的平台获取 |
cl_khr_icd |
使用示例代码
c
#include <CL/cl.h>
#include <stdio.h>
void printPlatformInfo(cl_platform_id platform) {
char buffer[1024];
// 获取平台名称
clGetPlatformInfo(platform, CL_PLATFORM_NAME, sizeof(buffer), buffer, NULL);
printf("Platform Name: %s\n", buffer);
// 获取平台供应商
clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, sizeof(buffer), buffer, NULL);
printf("Vendor: %s\n", buffer);
// 获取平台版本
clGetPlatformInfo(platform, CL_PLATFORM_VERSION, sizeof(buffer), buffer, NULL);
printf("Version: %s\n", buffer);
// 获取支持的扩展
clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, sizeof(buffer), buffer, NULL);
printf("Extensions: %s\n", buffer);
}
int main() {
cl_platform_id platforms[4];
cl_uint num_platforms;
// 1. 获取所有平台
cl_int err = clGetPlatformIDs(4, platforms, &num_platforms);
if (err != CL_SUCCESS) {
printf("Failed to get platforms: %d\n", err);
return 1;
}
printf("Found %d OpenCL platform(s)\n", num_platforms);
// 2. 打印每个平台信息
for (cl_uint i = 0; i < num_platforms; i++) {
printf("\n=== Platform %d ===\n", i);
printPlatformInfo(platforms[i]);
// 3. 获取平台设备信息
cl_device_id devices[8];
cl_uint num_devices;
err = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 8, devices, &num_devices);
if (err == CL_SUCCESS) {
printf("Number of devices: %u\n", num_devices);
}
}
// 4. 卸载编译器(可选)
if (num_platforms > 0) {
clUnloadPlatformCompiler(platforms[0]);
}
return 0;
}
平台属性常量
常量 |
值 |
描述 |
CL_PLATFORM_PROFILE_FULL |
"FULL_PROFILE" |
完整规范支持 |
CL_PLATFORM_PROFILE_EMBEDDED |
"EMBEDDED_PROFILE" |
嵌入式规范支持 |
错误代码
错误码 |
描述 |
CL_INVALID_PLATFORM |
无效的平台对象 |
CL_INVALID_VALUE |
无效的参数值 |
CL_OUT_OF_HOST_MEMORY |
主机内存不足 |
CL_PLATFORM_NOT_FOUND_KHR |
未找到平台(ICD扩展) |
最佳实践
-
平台选择:
c
// 优先选择支持所需扩展的平台
for (int i = 0; i < num_platforms; i++) {
char extensions[2048];
clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS, sizeof(extensions), extensions, NULL);
if (strstr(extensions, "cl_khr_gl_sharing")) {
// 选择支持OpenGL共享的平台
selected_platform = platforms[i];
break;
}
}
-
版本检查:
c
char version[128];
clGetPlatformInfo(platform, CL_PLATFORM_VERSION, sizeof(version), version, NULL);
int major, minor;
sscanf(version, "OpenCL %d.%d", &major, &minor);
if (major >= 2) {
// 支持OpenCL 2.x特性
}
-
多平台处理:
c
// 获取实际平台数量
cl_uint num_platforms;
clGetPlatformIDs(0, NULL, &num_platforms);
// 分配足够空间
cl_platform_id* platforms = malloc(sizeof(cl_platform_id) * num_platforms);
clGetPlatformIDs(num_platforms, platforms, NULL);
cl_device_id属性与函数
设备信息查询函数
函数 |
描述 |
参数说明 |
返回值 |
clGetDeviceInfo |
获取设备信息 |
device : 设备ID param_name : 查询参数 param_value_size : 缓冲区大小 param_value : 返回数据 param_value_size_ret : 实际数据大小 |
cl_int 错误码 |
设备类型常量
常量 |
值 |
描述 |
CL_DEVICE_TYPE_CPU |
(1 << 1) |
CPU设备 |
CL_DEVICE_TYPE_GPU |
(1 << 2) |
GPU设备 |
CL_DEVICE_TYPE_ACCELERATOR |
(1 << 3) |
加速器设备 |
CL_DEVICE_TYPE_CUSTOM |
(1 << 4) |
自定义设备 |
CL_DEVICE_TYPE_ALL |
~0 |
所有设备类型 |
设备基本信息属性
查询参数 |
描述 |
返回类型 |
CL_DEVICE_NAME |
设备名称 |
char[] |
CL_DEVICE_VENDOR |
设备供应商 |
char[] |
CL_DEVICE_VERSION |
OpenCL版本 |
char[] |
CL_DRIVER_VERSION |
驱动版本 |
char[] |
CL_DEVICE_PROFILE |
支持规范(FULL/EMBEDDED) |
char[] |
CL_DEVICE_TYPE |
设备类型 |
cl_device_type |
CL_DEVICE_AVAILABLE |
设备是否可用 |
cl_bool |
CL_DEVICE_COMPILER_AVAILABLE |
编译器是否可用 |
cl_bool |
设备硬件特性属性
查询参数 |
描述 |
返回类型 |
CL_DEVICE_MAX_COMPUTE_UNITS |
计算单元数量 |
cl_uint |
CL_DEVICE_MAX_CLOCK_FREQUENCY |
最大时钟频率(MHz) |
cl_uint |
CL_DEVICE_ADDRESS_BITS |
地址宽度(位) |
cl_uint |
CL_DEVICE_MAX_WORK_GROUP_SIZE |
最大工作组大小 |
size_t |
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS |
最大工作项维度 |
cl_uint |
CL_DEVICE_MAX_WORK_ITEM_SIZES |
各维度最大工作项大小 |
size_t[] |
内存特性属性
查询参数 |
描述 |
返回类型 |
CL_DEVICE_GLOBAL_MEM_SIZE |
全局内存大小(字节) |
cl_ulong |
CL_DEVICE_LOCAL_MEM_SIZE |
局部内存大小(字节) |
cl_ulong |
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE |
常量内存大小(字节) |
cl_ulong |
CL_DEVICE_GLOBAL_MEM_CACHE_SIZE |
全局内存缓存大小 |
cl_ulong |
CL_DEVICE_MAX_MEM_ALLOC_SIZE |
最大内存分配大小 |
cl_ulong |
CL_DEVICE_MEM_BASE_ADDR_ALIGN |
内存基址对齐(位) |
cl_uint |
图像支持属性
查询参数 |
描述 |
返回类型 |
CL_DEVICE_IMAGE_SUPPORT |
是否支持图像 |
cl_bool |
CL_DEVICE_IMAGE2D_MAX_WIDTH |
2D图像最大宽度 |
size_t |
CL_DEVICE_IMAGE2D_MAX_HEIGHT |
2D图像最大高度 |
size_t |
CL_DEVICE_IMAGE3D_MAX_WIDTH |
3D图像最大宽度 |
size_t |
CL_DEVICE_IMAGE3D_MAX_HEIGHT |
3D图像最大高度 |
size_t |
CL_DEVICE_IMAGE3D_MAX_DEPTH |
3D图像最大深度 |
size_t |
扩展功能属性
查询参数 |
描述 |
返回类型 |
CL_DEVICE_EXTENSIONS |
支持的扩展列表 |
char[] |
CL_DEVICE_PREFERRED_VECTOR_WIDTH_<type> |
各种数据类型的向量宽度 |
cl_uint |
OpenCL 2.0+ 新增属性
查询参数 |
描述 |
返回类型 |
CL_DEVICE_MAX_PIPE_ARGS |
最大管道参数数 |
cl_uint |
CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS |
管道最大活动保留数 |
cl_uint |
CL_DEVICE_PIPE_MAX_PACKET_SIZE |
管道最大数据包大小 |
cl_uint |
CL_DEVICE_SVM_CAPABILITIES |
SVM支持能力 |
cl_device_svm_capabilities |
设备分区属性(OpenCL 2.0+)
查询参数 |
描述 |
返回类型 |
CL_DEVICE_PARTITION_MAX_SUB_DEVICES |
最大子设备数量 |
cl_uint |
CL_DEVICE_PARTITION_PROPERTIES |
支持的分区类型 |
cl_device_partition_property[] |
CL_DEVICE_PARTITION_AFFINITY_DOMAIN |
支持的亲和域 |
cl_device_affinity_domain |
实用代码示例
c
#include <CL/cl.h>
#include <stdio.h>
void printDeviceInfo(cl_device_id device) {
char device_name[128];
cl_uint compute_units;
cl_ulong mem_size;
// 获取设备名称
clGetDeviceInfo(device, CL_DEVICE_NAME, sizeof(device_name), device_name, NULL);
printf("Device Name: %s\n", device_name);
// 获取计算单元数量
clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(compute_units), &compute_units, NULL);
printf("Compute Units: %u\n", compute_units);
// 获取全局内存大小
clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(mem_size), &mem_size, NULL);
printf("Global Memory: %.2f GB\n", (double)mem_size / (1024*1024*1024));
// 检查OpenCL版本
char device_version[64];
clGetDeviceInfo(device, CL_DEVICE_VERSION, sizeof(device_version), device_version, NULL);
printf("OpenCL Version: %s\n", device_version);
// 检查扩展支持
char extensions[2048];
clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, sizeof(extensions), extensions, NULL);
printf("Supports cl_khr_fp64: %s\n", strstr(extensions, "cl_khr_fp64") ? "Yes" : "No");
}
int main() {
cl_platform_id platform;
cl_device_id device;
// 获取平台和设备
clGetPlatformIDs(1, &platform, NULL);
clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
// 打印设备信息
printDeviceInfo(device);
return 0;
}
cl_context属性与函数
上下文是OpenCL的核心对象,管理所有关联设备和资源。合理设置上下文属性对性能和功能有重要影响。
上下文管理函数
函数 |
描述 |
参数 |
返回值 |
clCreateContext |
创建上下文 |
properties : 属性列表 num_devices : 设备数量 devices : 设备数组 pfn_notify : 回调函数 user_data : 用户数据 errcode_ret : 错误码 |
cl_context |
clCreateContextFromType |
按类型创建上下文 |
properties : 属性列表 device_type : 设备类型 pfn_notify : 回调函数 user_data : 用户数据 errcode_ret : 错误码 |
cl_context |
clRetainContext |
增加上下文引用计数 |
context : 上下文对象 |
cl_int |
clReleaseContext |
减少上下文引用计数 |
context : 上下文对象 |
cl_int |
clGetContextInfo |
获取上下文信息 |
context : 上下文 param_name : 查询参数 param_value_size : 值大小 param_value : 返回值 param_value_size_ret : 实际大小 |
cl_int |
上下文属性常量
属性常量 |
描述 |
值类型 |
CL_CONTEXT_PLATFORM |
关联的平台 |
cl_platform_id |
CL_CONTEXT_INTEROP_USER_SYNC |
互操作同步 |
cl_bool |
CL_GL_CONTEXT_KHR |
OpenGL 上下文共享 |
平台相关</ |