核心对象与属性
对象/属性
描述
示例
cl::Platform
表示OpenCL平台
cl::Platform::get(&platforms)
cl::Device
表示计算设备
cl::Device::getDefault()
cl::Context
管理设备、内存和命令队列的上下文
cl::Context(contextDevices)
cl::CommandQueue
命令队列,用于提交命令
cl::CommandQueue(context, device)
cl::Program
OpenCL程序对象
cl::Program(context, sources)
cl::Kernel
内核函数对象
cl::Kernel(program, "kernel_name")
cl::Buffer
内存缓冲区对象
cl::Buffer(context, flags, size)
cl::Image1D/Image2D等
图像对象
cl::Image1D(context, flags, format, width, host_ptr)
cl::Pipe
管道对象
cl::Pipe(context, flags, packet_size, max_packets)
Platform 属性与函数
Platform 对象代表 OpenCL 实现平台,通常对应不同的硬件供应商(如 NVIDIA、AMD、Intel 等)。选择适当的平台对应用性能有重要影响。
Platform 对象创建与获取
对象/函数
描述
示例
cl::Platform
Platform 对象
cl::Platform::get(&platforms)
cl::Platform::get(vector<Platform>*)
获取所有可用平台
cl::Platform::get(&platformList)
cl::Platform::getDefault()
获取默认平台
cl::Platform platform = cl::Platform::getDefault()
Platform 信息查询函数
函数
描述
返回类型
cl::Platform::getInfo<info_type>(param_name)
获取平台信息
取决于查询参数
cl::Platform::getDevices(device_type, vector<Device>*)
获取平台关联的设备
vector<cl::Device>
Platform 查询参数
查询参数
描述
返回类型
CL_PLATFORM_PROFILE
平台支持的OpenCL规范
string
CL_PLATFORM_VERSION
OpenCL版本信息
string
CL_PLATFORM_NAME
平台名称
string
CL_PLATFORM_VENDOR
平台供应商
string
CL_PLATFORM_EXTENSIONS
支持的扩展
string
CL_PLATFORM_ICD_SUFFIX_KHR
ICD后缀(需要扩展)
string
Platform 扩展函数
函数
描述
备注
cl::Platform::getHostTimerResolution()
获取主机计时器分辨率(OpenCL 2.1+)
需要 cl_khr_host_timer_resolution
扩展
cl::Platform::unloadCompiler()
卸载编译器资源
Platform 属性常量
常量
值
描述
CL_PLATFORM_PROFILE_FULL
"FULL_PROFILE"
完整规范支持
CL_PLATFORM_PROFILE_EMBEDDED
"EMBEDDED_PROFILE"
嵌入式规范支持
示例代码
cpp
// 1. 获取所有平台
vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
// 2. 遍历平台信息
for (auto &platform : platforms) {
string name = platform.getInfo<CL_PLATFORM_NAME>();
string vendor = platform.getInfo<CL_PLATFORM_VENDOR>();
string version = platform.getInfo<CL_PLATFORM_VERSION>();
cout << "Platform: " << name << "\n"
<< "Vendor: " << vendor << "\n"
<< "Version: " << version << endl;
// 3. 获取设备列表
vector<cl::Device> devices;
platform.getDevices(CL_DEVICE_TYPE_ALL, &devices);
// 4. 检查扩展支持
string extensions = platform.getInfo<CL_PLATFORM_EXTENSIONS>();
if (extensions.find("cl_khr_icd") != string::npos) {
cout << "ICD extension supported" << endl;
}
}
// 5. 获取默认平台
cl::Platform defaultPlatform = cl::Platform::getDefault();
// 6. 卸载编译器(减少资源占用)
defaultPlatform.unloadCompiler();
平台选择实用技巧
cpp
// 1. 按供应商选择平台
cl::Platform selectPlatform(const string &vendor) {
vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
for (auto &platform : platforms) {
string platformVendor = platform.getInfo<CL_PLATFORM_VENDOR>();
if (platformVendor.find(vendor) != string::npos) {
return platform;
}
}
throw runtime_error("No platform found for vendor: " + vendor);
}
// 2. 检查平台版本
bool checkPlatformVersion(cl::Platform &platform, int major, int minor) {
string version = platform.getInfo<CL_PLATFORM_VERSION>();
int platMajor, platMinor;
sscanf(version.c_str(), "OpenCL %d.%d", &platMajor, &platMinor);
return (platMajor > major) || (platMajor == major && platMinor >= minor);
}
错误处理
错误码
描述
CL_INVALID_PLATFORM
无效的平台对象
CL_INVALID_VALUE
无效的查询参数
CL_OUT_OF_HOST_MEMORY
主机内存不足
Device
属性与函数
Device 对象代表 OpenCL 可用的计算设备,了解设备属性和能力对于优化 OpenCL 程序性能至关重要。实际编程中应根据设备特性调整内核参数和工作组大小。
Device 对象获取
对象/函数
描述
示例
cl::Device
Device 对象
cl::Device::getDefault()
cl::Platform::getDevices(device_type, devices)
获取平台关联的设备
platform.getDevices(CL_DEVICE_TYPE_GPU, &devices)
cl::Device::getDefault()
获取默认设备
cl::Device device = cl::Device::getDefault()
设备信息查询函数
函数
描述
cl::Device::getInfo<info_type>(param_name)
获取设备信息
cl::Device::getSupportedImageFormats(context, flags, image_type)
获取支持的图像格式
设备类型常量
常量
描述
CL_DEVICE_TYPE_CPU
CPU 设备
CL_DEVICE_TYPE_GPU
GPU 设备
CL_DEVICE_TYPE_ACCELERATOR
加速器设备
CL_DEVICE_TYPE_CUSTOM
自定义设备
CL_DEVICE_TYPE_ALL
所有设备类型
设备基本信息查询
查询参数
描述
返回类型
CL_DEVICE_NAME
设备名称
string
CL_DEVICE_VENDOR
设备供应商
string
CL_DEVICE_VERSION
OpenCL 版本
string
CL_DRIVER_VERSION
驱动版本
string
CL_DEVICE_PROFILE
支持规范(FULL/EMBEDDED)
string
CL_DEVICE_TYPE
设备类型
cl_device_type
设备能力信息
查询参数
描述
返回类型
CL_DEVICE_MAX_COMPUTE_UNITS
计算单元数量
cl_uint
CL_DEVICE_MAX_CLOCK_FREQUENCY
最大时钟频率(MHz)
cl_uint
CL_DEVICE_ADDRESS_BITS
地址宽度(位)
cl_uint
CL_DEVICE_AVAILABLE
设备是否可用
cl_bool
CL_DEVICE_COMPILER_AVAILABLE
编译器是否可用
cl_bool
内存信息
查询参数
描述
返回类型
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_MAX_WORK_GROUP_SIZE
最大工作组大小
size_t
CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS
最大工作项维度
cl_uint
CL_DEVICE_MAX_WORK_ITEM_SIZES
各维度最大工作项大小
vector<size_t>
图像支持
查询参数
描述
返回类型
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
支持的扩展
string
CL_DEVICE_PREFERRED_VECTOR_WIDTH_<type>
各种类型的向量宽度
cl_uint
设备分区相关(OpenCL 2.0+)
查询参数
描述
CL_DEVICE_PARTITION_MAX_SUB_DEVICES
最大子设备数量
CL_DEVICE_PARTITION_PROPERTIES
支持的分区类型
CL_DEVICE_PARTITION_AFFINITY_DOMAIN
支持的亲和域
实用函数示例
cpp
// 1. 获取设备基本信息
void printDeviceInfo(cl::Device &device) {
cout << "Device: " << device.getInfo<CL_DEVICE_NAME>() << "\n"
<< "Vendor: " << device.getInfo<CL_DEVICE_VENDOR>() << "\n"
<< "Version: " << device.getInfo<CL_