当前位置: 首页 > article >正文

OpenCL C++ 常见属性与函数

核心对象与属性

对象/属性描述示例
cl::Platform表示OpenCL平台cl::Platform::get(&platforms)
cl::Device表示计算设备cl::Device::getDefault()
cl::Context管理设备、内存和命令队列的上下文cl::Context(contextDevices)
cl::CommandQueue命令队列,用于提交命令cl::CommandQueue(context, device)
cl::ProgramOpenCL程序对象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::PlatformPlatform 对象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_VERSIONOpenCL版本信息string
CL_PLATFORM_NAME平台名称string
CL_PLATFORM_VENDOR平台供应商string
CL_PLATFORM_EXTENSIONS支持的扩展string
CL_PLATFORM_ICD_SUFFIX_KHRICD后缀(需要扩展)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::DeviceDevice 对象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_CPUCPU 设备
CL_DEVICE_TYPE_GPUGPU 设备
CL_DEVICE_TYPE_ACCELERATOR加速器设备
CL_DEVICE_TYPE_CUSTOM自定义设备
CL_DEVICE_TYPE_ALL所有设备类型

设备基本信息查询

查询参数描述返回类型
CL_DEVICE_NAME设备名称string
CL_DEVICE_VENDOR设备供应商string
CL_DEVICE_VERSIONOpenCL 版本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_WIDTH2D图像最大宽度size_t
CL_DEVICE_IMAGE2D_MAX_HEIGHT2D图像最大高度size_t
CL_DEVICE_IMAGE3D_MAX_WIDTH3D图像最大宽度size_t
CL_DEVICE_IMAGE3D_MAX_HEIGHT3D图像最大高度size_t
CL_DEVICE_IMAGE3D_MAX_DEPTH3D图像最大深度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_
http://www.lryc.cn/news/2378412.html

相关文章:

  • Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
  • 18.自动化生成知识图谱的多维度质量评估方法论
  • 【行为型之命令模式】游戏开发实战——Unity可撤销系统与高级输入管理的架构秘钥
  • 图论模板(部分)
  • LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)
  • NBA足球赛事直播源码体育直播M33模板赛事源码
  • 【QT 项目部署指南】使用 Inno Setup 打包 QT 程序为安装包(超详细图文教程)
  • 电子电器架构 --- 整车造车阶段四个重要节点
  • 黑马点评-用户登录
  • ecmascript 第6版特性 ECMA-262 ES6
  • 十二、Hive 函数
  • No More Adam: 新型优化器SGD_SaI
  • 数据结构【AVL树】
  • C#将1GB大图裁剪为8张图片
  • 数据库——SQL约束窗口函数介绍
  • Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
  • JSP链接MySQL8.0(Eclipse+Tomcat9.0+MySQL8.0)
  • Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析
  • SEO长尾词与关键词优化实战
  • 机器学习-人与机器生数据的区分模型测试-数据处理1
  • HelloWorld
  • 令牌桶和漏桶算法使用场景解析
  • 轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
  • SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据
  • 2020CCPC河南省赛题解
  • 数字万用表与指针万用表使用方法及注意事项
  • 虚拟主播肖像权保护,数字时代的法律博弈
  • 【读代码】端到端多模态语言模型Ultravox深度解析
  • RabbitMQ工作流程及使用方法
  • Java 面向对象进阶:解锁多态、内部类与包管理