OpenCL 学习(2)---- OpenCL Platform 和 Device

目录

        • OpenCL Platform
        • OpenCL Device
        • 参考代码

OpenCL Platform

opencl 支持的 Platform 可以使用 clGetPlatformIDs 函数查询,函数原型如下:

clGetPlatformIDs(cl_uint          /* num_entries */,cl_platform_id * /* platforms */,cl_uint *        /* num_platforms */);

如果将platforms参数设置为nullptrnum_platforms会返回当前平台上可用的platform数量
一般将 num_entriesplatforms 设置为 0 和 nullptr 来查询可用的platform数量

在得到当前支持platform 的前提下,设置 num_entriesplatforms 就可以获取到所有的 platfromID,参考代码如下:

	std::vector<cl_platform_id> clplatform;cl_uint num_platform;err = clGetPlatformIDs(0, nullptr, &num_platform);std::cout << "number of platforms: " << num_platform << std::endl;clplatform.resize(num_platform);err = clGetPlatformIDs(num_platform, clplatform.data(), NULL);

获取到 platfromID 之后,可以使用 clGetPlatformInfo 获取平台的信息,其原型如下:

clGetPlatformInfo(cl_platform_id   /* platform */, cl_platform_info /* param_name */,size_t           /* param_value_size */, void *           /* param_value */,size_t *         /* param_value_size_ret */);
  • cl_platform_id 前面获取的的 platformId
  • cl_platform_info 设置需要获取到的 platformInfo
  • param_value_size 对应的 param_value 的字符串大小
  • param_value 对应的 param_value 的字符串指针
  • 返回获取的 param_value_size

一般先将param_value_sizeparam_value设置为 0 和nullptr,返回param_valuesize大小,
然后使用获取到的size 传递给param_value_size,得到对应的param_value

对于不同的platformInfo信息,含义如下:

platformInfo返回类型说明
CL_PLATFORM_PROFILEchar[]FULL_PROFILE 或者 EMBEDDED_PROFILE
CL_PLATFORM_VERSIONchar[]opencl 版本
CL_PLATFORM_NAMEchar[]平台名称
CL_PLATFORM_VENDORchar[]平台厂商
CL_PLATFORM_EXTENSIONSchar[]平台支持扩展名

FULL_PROFILE:支持定位为核心规范的所有功能
EMBEDDED_PROFILE: 支持定位为核心规范的所有功能的一个子集

OpenCL Device

每个平台可能关联到一组计算设备,应用程序通过这些计算设备执行内核程序,使用
clGetDeviceIDs 查询支持的设备列表

extern CL_API_ENTRY cl_int CL_API_CALL
clGetDeviceIDs(cl_platform_id   /* platform */,cl_device_type   /* device_type */, cl_uint          /* num_entries */, cl_device_id *   /* devices */, cl_uint *        /* num_devices */) CL_API_SUFFIX__VERSION_1_0;

这个函数会得到于 platformID 关联的所有的 OpenCL 设备列表,如果参数 devices 设置为 null,clGetDeviceIDs 会返回设备数,返回的设备数可以用 num_entries来限制(0 < num_entries <= 设备数)

其中的 cl_device_type 可以是下表中的一个值:

cl_device_type描述
CL_DEVICE_TYPE_CPU作为宿主机处理器的 OpenCL 设备
CL_DEVICE_TYPE_GPU作为 GPU 的 OpenCL 设备
CL_DEVICE_TYPE_ACCELERATOROpenCL 加速器
CL_DEVICE_TYPE_ALL和平台关联的所有 OpenCL 设备

给定一个设备,可以使用下面函数查询各种属性:

extern CL_API_ENTRY cl_int CL_API_CALL
clGetDeviceInfo(cl_device_id    /* device */,cl_device_info  /* param_name */, size_t          /* param_value_size */, void *          /* param_value */,size_t *        /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0;

可以将param_value_sizeparam_value设置为 0 和 nullptr 来查询返回值的大小

具体可以查询的 Device 属性如下图所示:
OpenCL device

参考代码

获取 platform 和 device 属性的参考代码如下:

void getCLPlatformInfo() {cl_int err;//cl_platform_id* platform;std::vector<cl_platform_id> clplatform;cl_uint num_platform;std::vector<cl_device_id> cldevice;cl_uint num_device;err = clGetPlatformIDs(0, nullptr, &num_platform);std::cout << "number of platforms: " << num_platform << std::endl;clplatform.resize(num_platform);err = clGetPlatformIDs(num_platform, clplatform.data(), NULL);for (auto& platform : clplatform) {size_t size;err = clGetPlatformInfo(platform, CL_PLATFORM_NAME, 0, NULL, &size);cl_char* PName = new cl_char[size];err = clGetPlatformInfo(platform, CL_PLATFORM_NAME, size, PName, NULL);printf("CL_PLATFORM_NAME: %s\n", PName);err = clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, 0, NULL, &size);cl_char* PVendor = new cl_char[size];err = clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, size, PVendor, NULL);printf("CL_PLATFORM_VENDOR: %s\n", PVendor);err = clGetPlatformInfo(platform, CL_PLATFORM_VERSION, 0, NULL, &size);cl_char* PVersion = new cl_char[size];err = clGetPlatformInfo(platform, CL_PLATFORM_VERSION, size, PVersion, NULL);printf("CL_PLATFORM_VERSION: %s\n", PVersion);err = clGetPlatformInfo(platform, CL_PLATFORM_PROFILE, 0, NULL, &size);cl_char* PProfile = new cl_char[size];err = clGetPlatformInfo(platform, CL_PLATFORM_PROFILE, size, PProfile, NULL);printf("CL_PLATFORM_PROFILE: %s\n", PProfile);err = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, 0, NULL, &size);cl_char* PExten = new cl_char[size];err = clGetPlatformInfo(platform, CL_PLATFORM_EXTENSIONS, size, PExten, NULL);printf("CL_PLATFORM_EXTENSIONS: %s\n", PExten);delete[] PName;delete[] PVendor;delete[] PVersion;delete[] PProfile;delete[] PExten;}std::cout << "\n=======================================================\n" << std::endl;for (auto& platform : clplatform) {size_t size;err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 0, nullptr, &num_device);std::cout << "num of device:" << num_device << std::endl;cldevice.resize(num_device);err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, num_device, cldevice.data(), nullptr);for (auto& device : cldevice) {// deviceNameerr = clGetDeviceInfo(device, CL_DEVICE_NAME, 0, nullptr, &size);cl_char* PDeviceName = new cl_char[size];err = clGetDeviceInfo(device, CL_DEVICE_NAME, size, PDeviceName, nullptr);std::cout << "PDeviceName:" << PDeviceName << std::endl;// device vendorerr = clGetDeviceInfo(device, CL_DEVICE_VENDOR, 0, nullptr, &size);cl_char* PDeviceVendor = new cl_char[size];err = clGetDeviceInfo(device, CL_DEVICE_VENDOR, size, PDeviceVendor, nullptr);std::cout << "PDeviceVendor:" << PDeviceVendor << std::endl;// driver versionerr = clGetDeviceInfo(device, CL_DRIVER_VERSION, 0, nullptr, &size);cl_char* PDriverVersion = new cl_char[size];err = clGetDeviceInfo(device, CL_DRIVER_VERSION, size, PDriverVersion, nullptr);std::cout << "PDriverVersion:" << PDriverVersion << std::endl;// device profileerr = clGetDeviceInfo(device, CL_DEVICE_PROFILE, 0, nullptr, &size);cl_char* PProfile = new cl_char[size];err = clGetDeviceInfo(device, CL_DEVICE_PROFILE, size, PProfile, nullptr);std::cout << "PProfile:" << PProfile << std::endl;// device versionerr = clGetDeviceInfo(device, CL_DEVICE_VERSION, 0, nullptr, &size);cl_char* PDeviceVersion = new cl_char[size];err = clGetDeviceInfo(device, CL_DEVICE_VERSION, size, PDeviceVersion, nullptr);std::cout << "PDeviceVersion:" << PDeviceVersion << std::endl;// device opencl c versionerr = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_VERSION, 0, nullptr, &size);cl_char* POpenCLCVersion = new cl_char[size];err = clGetDeviceInfo(device, CL_DEVICE_OPENCL_C_VERSION, size, POpenCLCVersion, nullptr);std::cout << "POpenCLCVersion:" << POpenCLCVersion << std::endl;// device extensionerr = clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, 0, nullptr, &size);cl_char* PDeviceExtensions = new cl_char[size];err = clGetDeviceInfo(device, CL_DEVICE_EXTENSIONS, size, PDeviceExtensions, nullptr);std::cout << "PDeviceExtensions:" << PDeviceExtensions << std::endl;// 最大计算单元数cl_uint UnitNum;err = clGetDeviceInfo(device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &UnitNum, nullptr);std::cout << "Max ComputeUnit Number:" << UnitNum << std::endl;// 最高核心频率cl_uint frequency;err = clGetDeviceInfo(device, CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(cl_uint), &frequency, nullptr);std::cout << "Max clock frequency:" << frequency << std::endl;// 查询设备全局内存大小cl_ulong GlobalSize;err = clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(cl_ulong), &GlobalSize, nullptr);std::cout << "GlobalSize Uniform Memory Size(B):" << GlobalSize << std::endl;// 查询设备全局内存缓存行cl_uint GlobalCacheLine;err = clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, sizeof(cl_uint), &GlobalCacheLine, nullptr);std::cout << "Device Global CacheLine(B):" << GlobalCacheLine << std::endl;delete[] PDeviceName;delete[] PDeviceVendor;delete[] PDriverVersion;delete[] PProfile;delete[] PDeviceVersion;delete[] POpenCLCVersion;delete[] PDeviceExtensions;}}}

在我的 Ryen5 集成 Radeon Graphics Vega 8 集成显卡的笔记本得到的结果如下:

CL_PLATFORM_PROFILE: FULL_PROFILE
CL_PLATFORM_EXTENSIONS: cl_khr_icd cl_khr_d3d10_sharing cl_khr_d3d11_sharing cl_khr_dx9_media_sharing cl_amd_event_callback cl_amd_offline_devices
=======================================================
num of device:1
PDeviceName:gfx902
PDeviceVendor:Advanced Micro Devices, Inc.
PDriverVersion:3570.0 (PAL,HSAIL)
PProfile:FULL_PROFILE
PDeviceVersion:OpenCL 2.0 AMD-APP (3570.0)
POpenCLCVersion:OpenCL C 2.0
PDeviceExtensions:cl_khr_fp64 cl_amd_fp64 cl_khr_global_int32_base_atomics cl_khr_global_int32_extended_atomics cl_khr_local_int32_base_atomics cl_khr_local_int32_extended_atomics cl_khr_int64_base_atomics cl_khr_int64_extended_atomics cl_khr_3d_image_writes cl_khr_byte_addressable_store cl_khr_fp16 cl_khr_gl_sharing cl_amd_device_attribute_query cl_amd_vec3 cl_amd_printf cl_amd_media_ops cl_amd_media_ops2 cl_amd_popcnt cl_khr_d3d10_sharing cl_khr_d3d11_sharing cl_khr_dx9_media_sharing cl_khr_image2d_from_buffer cl_khr_subgroups cl_khr_gl_event cl_khr_depth_images cl_khr_mipmap_image cl_khr_mipmap_image_writes cl_amd_copy_buffer_p2p cl_amd_planar_yuv
Max ComputeUnit Number:8
Max clock frequency:1201
GlobalSize Uniform Memory Size(B):7534542848
Device Global CacheLine(B):64

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发

基本概念 CPU&#xff08;中央处理器&#xff0c;Central Processing Unit&#xff09;占用率分为系统CPU占用率和任务CPU占用率。 系统CPU占用率&#xff1a;是指周期时间内系统的CPU占用率&#xff0c;用于表示系统一段时间内的闲忙程度&#xff0c;也表示CPU的负载情况。系…

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…

告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件

前言 在这个快节奏的时代&#xff0c;我们每天都在忙碌中度过&#xff0c;手机虽然方便&#xff0c;但往往难以找到一整块时间来专心背单词。然而&#xff0c;你是否意识到&#xff0c;每天坐在电脑前的时间远比使用手机的时间要长&#xff1f;现在我们来介绍一个新型的学习软…

基于大数据的电子产品需求数据分析系统的设计与实现(Python Vue Flask Mysql)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候&#xff0c;发现了一些小小的问题&#xff0c;已经在 上述代码中体现。① 代码路径碰到中文的时候&#xff0c;会有乱码&#xff0c;需要转换&#xff08;内容中…

浏览器插件利器--allWebPluginV2.0.0.20-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

我的AI工具箱Tauri版-VideoIntroductionClipCut视频介绍混剪

本教程基于自研的AI工具箱Tauri版进行VideoIntroductionClipCut视频介绍混剪。 本项目为自研的AI工具箱Tauri版中的视频剪辑模块&#xff0c;专注于自动生成视频介绍片段。该模块名为 VideoIntroductionClipCut&#xff0c;用户可以通过该工具快速进行视频的混剪和介绍内容的生…

【网络】高级IO——epoll版本TCP服务器初阶

目录 前言 一&#xff0c;epoll的三个系统调用接口 1.1.epoll_create函数 1.1.1.epoll_create函数干了什么 1.2. epoll_ctl函数 1.2.1.epoll_ctl函数函数干了什么 1.3.epoll_wait函数 1.3.1.epoll_wait到底干了什么 1.4.epoll的工作过程中内核在干什么 二&#xff0c;…

nginx upstream转发连接错误情况研究

本次测试用到3台服务器&#xff1a; 192.168.10.115&#xff1a;转发服务器A 192.168.10.209&#xff1a;upstream下服务器1 192.168.10.210&#xff1a;upstream下服务器2 1台客户端&#xff1a;192.168.10.112 服务器A中nginx主要配置如下&#xff1a; log_format main…

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会&#xff0c;随着医疗服务需求的不断增长和医疗信息化的快速发展&#xff0c;提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…

Nginx 跨域 + 无法设置 Cookie 解决办法

今天来分享一下关于项目部署上线时怎么解决跨域问题!!! 首先感谢一下大佬的方法,才让这个困扰我很久的问题得以解决!!! 这也是我请教大佬才解决的问题,大佬和我说,这是他耗费两周才解决的问题,我这也是属于前人栽树后人乘凉了,嘿嘿嘿!!! 前端问题 前端没有携带 cookie 导致后端…

uni-app安装插件

1.通过插件市场安装https://ext.dcloud.net.cn 打开HBuilderX编辑器。 点击菜单栏中的“工具”->“插件安装”。 这里会看到已安装插件和安装新插件两个选项卡&#xff0c;点击安装新插件&#xff0c; 能看到一些核心插件&#xff0c;如果所需要的插件在核心插件里面有&…

1、vectorCast单元测试常用操作

一、自动创建测试工程 1、设置工作目录 进入软件主页面,点击file,选择set working directory,随便选择一个保存该项目的目录即可。 2、创建一个空工程 编译器选择vector自带的编译器,vectorCast MinGW C。 此时项目工程就创建好了 2.1、配置编译器节点 点击编译器节点…

KVM环境下制作ubuntu qcow2格式镜像

如果是Ubuntu KVM环境是VMware虚拟机&#xff0c;需要CPU开启虚拟化 1、配置镜像源 wget -O /etc/apt/sources.list https://www.qingtongqing.cc/ubuntu/sources.list2、安装kvm qemu-img libvirt kvm虚拟化所需环境组件 apt -y install qemu-kvm virt-manager libvirt-da…

Redisson 总结

1. 基础使用 1.1 引入依赖 <dependencies><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId></dependency> </dependencies>包含的依赖如下 1.2 配置文件 其实默认主机就…

Java基础总结(2)

1.实例方法和静态方法的区别 调用方式不同&#xff1a;静态方法可以通过类名.方法名直接调用&#xff0c;也可以通过当前类的实例对象.方法名来调用&#xff0c;但是实例方法只能通过后者来访问访问类的成员存在限制&#xff1a;在静态方法内部&#xff0c;只能访问类的静态成员…

【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构

唯有梦想才配让你不安&#xff0c; 唯有行动才能解除你的不安。 --- 卢思浩 --- 从零开始掌握序列化 1 知识回顾2 序列化与编写协议2.1 使用Json进行序列化2.2 编写协议 3 封装IOService4 应用层 --- 网络计算器5 总结 1 知识回顾 上一篇文章我们讲解了协议的本质是双方能够…

WPF DataGrid 单元格居中,头部居中,点击行改变背景色。

我得全局样式都写在了App.XAML文件下的ResourceDictionary里&#xff0c;方便全局引用 DataGrid样式和点击改变行背景色的触发器(BasedOn继承的是UI框架的样式&#xff0c;若无则删除&#xff0c;触发器还有鼠标移动事件等&#xff0c;按需自行修改添加) <Style x:Key&quo…

安卓13长按电源按键直接关机 andriod13不显示关机对话框直接关机

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有些设备需要在长按电源键的时候,直接关机。不需要弹出对话框进行询问。 2.问题分析 过滤电源按键,需要在系统里面处理的话,那么我们需要熟悉android的事件分发,然后再…