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

news2024/11/14 4:49:28

目录

        • 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) {
			// deviceName
			err = 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 vendor
			err = 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 version
			err = 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 profile
			err = 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 version
			err = 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 version
			err = 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 extension
			err = 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.coloradmin.cn/o/2157345.html

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

相关文章

解锁亚马逊测评自养号防关联新技术

解锁亚马逊测评自养号防关联的新技术主要包括以下几个方面&#xff0c;这些技术旨在提高测评过程的安全性&#xff0c;降低账号被关联的风险&#xff1a; 1. 独立纯净IP技术 独立纯净IP&#xff1a;采用独立、纯净且未受污染的国外IP地址&#xff0c;确保这些IP未被标记或列入…

CSS clip-path 属性的使用

今天记录一个css属性clip-path&#xff0c;首先介绍下这个属性。 clip-path 是CSS中的一个神奇属性&#xff0c;它能够让你像魔术师一样&#xff0c;对网页元素施展“裁剪魔法”——只展示元素的一部分&#xff0c;隐藏其余部分。想象一下&#xff0c;不用依赖图片编辑软件&am…

JavaWeb--纯小白笔记04:Tomcat整合IDEA

IDEA整合Tomcat 1.点击Idea的导航栏里的Run&#xff0c;选择Edit Configurations 2.点击左上角的""&#xff0c;向下翻找到Tomcat Server 选择里面的Local 3.创建一个web工程&#xff0c;点击IDEA的File-->new-->project 然后选择Java Enterprise&#xff0c;…

【网络安全】网络基础第一阶段——第一节:网络协议基础---- OSI与TCP/IP协议

从今天起&#xff0c;我们正式进入第二部分——网络基础。继续学习网络基础、网络协议等相关内容&#x1f31f;&#x1f31f;&#x1f31f; 目录 一、OSI模型 1.1 分层思想 1.2 OSI参考模型 1.3 数据封装与解封装 1.3.1 数据的封装过程 1.3.2 数据的解封装过程 二、TCP/…

实现信创Linux桌面录制成MP4(源码,银河麒麟、统信UOS)

信创国产化已是大势所趋&#xff0c;在国产操作系统上的应用开发的需求越来越多&#xff0c;比如&#xff0c;有客户需要在银河麒麟和统信UOS上实现录制桌面生成一个mp4文件。那么这个要如何实现了&#xff1f; 一. 技术方案 要完成这些功能&#xff0c;具体来说&#xff0c;…

初写MySQL四张表:(4/4)

进度条很喜人&#xff0c;你是否已经修炼到这一步了呢&#xff1f; 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)_数据库表样例-CSDN博客 初写MySQL四张表:(3/4)-CSDN博客 若现在你已经有了前面的基础&#xff0c;那就正式开始吧。 四张表&#xff1a; 这次在实现…

JavaScript 基础 - 第20天_Node.js入门

文章目录 Day01_Node.js入门提前安装软件目录学习目标01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.案例-压缩前端JS目标讲解小结 06.认识URL中的端口号目标讲解小结 07.http模块-创建…

花生壳、神卓互联等主流内网穿透技术分享

目录 贝锐花生壳 PHTunnel技术 神卓互联WanGooe Tunnel 技术 贝锐花生壳 PHTunnel技术 贝锐花生壳内网穿透服务商&#xff0c;(使用技术&#xff1a;底层采用自研 PHTunnel技术)除了具备无需公网IP&#xff0c;无需搭建专线、3步创建映射等优势&#xff0c;还拥有可靠、稳定的…

JAVA开源项目 图书馆管理系统 计算机毕业设计

本文项目编号 T 044 &#xff0c;文末自助获取源码 \color{red}{T044&#xff0c;文末自助获取源码} T044&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

Go 语言框架接入阿里云的报警通知与日志实时追踪与监控

在现代应用开发中&#xff0c;实时监控和报警是确保系统稳定性和高可用性的重要组成部分。 本文将介绍如何使用 Go 语言框架接入阿里云的报警通知与日志追踪。 ## 1. 环境准备 ### 1.1 安装 Go 确保你的开发环境中已经安装了 Go 语言。可以从 [Go 官网](https://golang.org/d…

使用 Docker 部署 RStudio 的终极教程

一.介绍 在现代数据科学和统计分析领域&#xff0c;RStudio 是一个广受欢迎的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为用户提供了强大的工具来编写、调试和可视化 R 代码。然而&#xff0c;传统的 RStudio 安装可能面临环境配置复杂、版本兼容性等问题。Docker…

SpringCloud Alibaba之Seata处理分布式事务

&#xff08;学习笔记&#xff0c;必用必考&#xff09; 问题&#xff1a;Transactional 的9种失效场景&#xff1f; 1、介绍 1.1、简介 官网地址&#xff1a;Apache Seata 源码地址&#xff1a;Releases apache/incubator-seata GitHub Seata是一款开源的分布式事务解决…

Redis面试真题总结(四)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ AOF 持久化&#xff1f; AOF&#xff08;Append Only File&#x…

基于机器学习的区域能源生产与消费的分析与预测系统实现,前端layui,后端flask,可视化echarts

1 绪论 1.1选题的意义 基于机器学习的区域能源生产与消费的分析与预测研究具有重要意义。随着能源需求不断增长和资源供给压力加大&#xff0c;能源生产与消费的合理规划和管理成为当务之急。通过机器学习技术&#xff0c;可以对大规模的能源数据进行深入挖掘和分析&#xff…

Qt-QTextEdit的输入类控件(30)

目录 描述 相关属性 相关信号 使用 文本内容改变时触发 选中内容时发生改变 光标位置发生改变时触发 可复制&#xff0c;可撤销&#xff0c;可恢复发生改变时触发 undo撤销 redo恢复 copy复制 描述 这是一个多行输入框 有两个很像的&#xff0c;需要注意一下&…

【软件工程】实体联系图

一、数据模型 二、实体联系图&#xff08;E-R图&#xff09; 例题 选择题

CSS-Grid布局详解

前言 Grid 栅格布局 是 CSS 语言中非常强大的种布局&#xff0c;它提供了丰富的工具属性&#xff0c;可以轻松实现复杂且灵活的布局设计&#xff0c;因此想要完美使用CSS Grid 也有一定的难度和复杂性&#xff0c;我自己也是花了不少时间才真正掌握它的使用&#xff0c;在这篇…

【软件造价咨询】工程活动工作量分布占比的统计分析

在软件项目管理中&#xff0c;准确估算工程活动的工作量是确保项目按时、按预算完成的关键。工程活动工作量分布基准数据明细提供了一种量化工作量的方法&#xff0c;可以帮助团队成员更好地预测和把控不同工程活动所需的工作量。本文将探讨工程活动工作量分布基准数据明细的意…

offsetX、offsetY...

文章目录 offsetX & offsetYclientX & clientYpageX & pageYscreenX & screenYinnerHeight & innerWidthoffsetHeight & offsetWidthoffsetTop & offsetLeftscrollHeight & scrollWidthscrollTop & scrollLeft:与scrollHeight和scrollWidt…

图为科技大模型一体机,智领未来社区服务

当AI与边缘计算相遇&#xff0c;一幅关于智慧生活的宏伟蓝图正缓缓展开。 今天&#xff0c;让我们一同探索&#xff0c;如何通过图为大模型一体机&#xff0c;为物业服务插上智能的翅膀。 通过整合采集物业数据&#xff0c;大模型一体机可全方位为物业行业赋能&#xff0c;实…