OpenCL C 常见属性与函数

核心对象与属性

对象/属性 描述 示例
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扩展)

最佳实践

  1. 平台选择

    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;
        }
    }
  2. 版本检查

    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特性
    }
  3. 多平台处理

    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 上下文共享 平台相关</