CUDA 运行时GPU信息查询

news2025/1/19 21:12:22

cuda 官网文档名:CUDA_Runtime_API

运行时API查询GPU信息

调用

cudaDeviceProp prop;

cudaGetDeviceProperties(&prop, device_id)

定义

由此可见,只能在主机上调用。

#include <cuda_runtime.h>

#include <iostream>
#include <stdio.h>

static void CheckCudaErrorAux(const char*, unsigned, const char*, cudaError_t);
#define CUDA_CHECK_RETURN(value) CheckCudaErrorAux(__FILE__,__LINE__, #value, value)


int main()
{
	int iDeviceId = 0;
	CUDA_CHECK_RETURN(cudaGetDevice(&iDeviceId));

	cudaDeviceProp prop;
	cudaGetDeviceProperties(&prop, iDeviceId);
	std::cout << "device_id :                                      " << iDeviceId << std::endl;
	std::cout << "device_name :                                    " << prop.name << std::endl;
	std::cout << "compute capability :                             " << prop.major << "." << prop.minor << std::endl;
	std::cout << "amount of global memory :                        " << prop.totalGlobalMem / (1024.0*1024*1024)<<"GB" << std::endl;
	std::cout << "amount of constant memory  :                     " << prop.totalConstMem / 1024.0 << "KB" << std::endl;
	std::cout << "maximum grid size :                              " << prop.maxGridSize[0] <<"," << prop.maxGridSize[1] << "," << prop.maxGridSize[2] << std::endl;
	std::cout << "maximum block size :                             " << prop.maxThreadsDim[0] << "," << prop.maxThreadsDim[1] << "," << prop.maxThreadsDim[2] << std::endl;
	std::cout << "number of SMs :                                  " << prop.multiProcessorCount << std::endl;
	std::cout << "maximum amount of shared memory per block :      " << prop.sharedMemPerBlock / 1024.0 << "KB" << std::endl;
	std::cout << "maximum amount of shared memory per SM :         " << prop.sharedMemPerMultiprocessor / 1024.0 << "KB" << std::endl;
	std::cout << "maximum number of registers per block :          " << prop.regsPerBlock / 1024.0 << "K" << std::endl;
	std::cout << "maximum number of registers per SM :             " << prop.regsPerMultiprocessor / 1024.0 << "K" << std::endl;
	std::cout << "maximum number of thread per block :             " << prop.maxThreadsPerBlock << std::endl;
	std::cout << "maximum number of thread per SM :                " << prop.maxThreadsPerMultiProcessor << std::endl;

	return 0;
}

static void CheckCudaErrorAux(const char* file, unsigned line, const char* statement, cudaError_t err)
{
	if (err == cudaSuccess)
		return;
	std::cerr << statement << " returned: " << cudaGetErrorName(err) << "  \t : " << cudaGetErrorString(err) << "(" << err << ") at " << file << ":" << line << std::endl;
	exit(1);
}

结果

查询GPU计算核心数量

#include "cuda_runtime_api.h"
#include <stdio.h>
#include <iostream>

static void CheckCudaErrorAux(const char*, unsigned, const char*, cudaError_t);
#define CUDA_CHECK_RETURN(value) CheckCudaErrorAux(__FILE__,__LINE__, #value, value)

int getSPcores(cudaDeviceProp devProp)
{
	int cores = 0;
	int mp = devProp.multiProcessorCount;
	switch (devProp.major) {
	case 2: // Fermi
		if (devProp.minor == 1) cores = mp * 48;
		else cores = mp * 32;
		break;
	case 3: // Kepler
		cores = mp * 192;
		break;
	case 5: // Maxwell
		cores = mp * 128;
		break;
	case 6: // Pascal
		if ((devProp.minor == 1) || (devProp.minor == 2)) cores = mp * 128;
		else if (devProp.minor == 0) cores = mp * 64;
		else printf("Unknown device type\n");
		break;
	case 7: // Volta and Turing
		if ((devProp.minor == 0) || (devProp.minor == 5)) cores = mp * 64;
		else printf("Unknown device type\n");
		break;
	case 8: // Ampere
		if (devProp.minor == 0) cores = mp * 64;
		else if (devProp.minor == 6) cores = mp * 128;
		else if (devProp.minor == 9) cores = mp * 128; // ada lovelace
		else printf("Unknown device type\n");
		break;
	case 9: // Hopper
		if (devProp.minor == 0) cores = mp * 128;
		else printf("Unknown device type\n");
		break;
	default:
		printf("Unknown device type\n");
		break;
	}
	return cores;
}

int main()
{
	int iDeviceId = 0;
	CUDA_CHECK_RETURN(cudaGetDevice(&iDeviceId));
	cudaDeviceProp prop;
	CUDA_CHECK_RETURN(cudaGetDeviceProperties(&prop, iDeviceId));

	std::cout << "Compute cores is " << getSPcores(prop) << std::endl;
	return 0;
}

static void CheckCudaErrorAux(const char* file, unsigned line, const char* statement, cudaError_t err)
{
	if (err == cudaSuccess)
		return;
	std::cerr << statement << " returned: " << cudaGetErrorName(err) << "  \t : " << cudaGetErrorString(err) << "(" << err << ") at " << file << ":" << line << std::endl;
	exit(1);
}

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

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

相关文章

Apache Kafka消息传递策略

kafka消息传递策略 微信公众号&#xff1a;阿俊的学习记录空间小红书&#xff1a;ArnoZhangwordpress&#xff1a;arnozhang1994博客园&#xff1a;arnozhangCSDN&#xff1a;ArnoZhang1994 现在我们了解了一些关于生产者和消费者的工作原理&#xff0c;接下来讨论Kafka在生产…

Java:玩家打怪小游戏

今天&#xff0c;我们尝试用Java来做一个“打怪小游戏”&#xff0c;听名字就知道&#xff0c;我们是应该创建几个成员和怪物&#xff0c;还有知道知道成员和怪物的血量&#xff0c;一次攻击的伤害等等。。当然我们的游戏攻击模式是“回合制”&#xff08;其实是别的方法&#…

SpringCloud-OpenFeign-服务接口调用

是什么 把需要暴露的api使用接口来暴露&#xff0c;客户端需要调用的时候&#xff0c;直接查看这个接口中有没有就可以了 通用步骤 架构说明 common模块 common 引入 openfeign 新建服务接口类 FeignClient(value "cloud-payment-service") // 服务名 public i…

【数据采集工具】Flume从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十三)--权限设置注意事项和属主属组设置sudo操作

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十三&#xff09;–权限设置注意事项和属主属组设置sudo操作 一、linux 权限设置 特殊注意事项 1、使用root用户创建一个文件夹&#xff08;/oo&#xff09;&#xff0c;权限默认&…

前端知识点总和

目录 一、canvas&#xff1a; &#xff08;1&#xff09;创建canvas标签&#xff1a; &#xff08;2&#xff09;使用JS获得这个canvas标签的DOM对象&#xff1a; &#xff08;3&#xff09;决定是画二维还是三维的画&#xff1a; &#xff08;4&#xff09;API&#xff1…

企业防止信息泄露的措施有哪些?10个防止信息泄露小技巧分享给你

在数字化时代&#xff0c;企业面临的安全挑战日益严峻&#xff0c;尤其是信息泄露问题。一旦企业内部或外部的敏感信息遭到泄露&#xff0c;不仅会造成巨大的经济损失&#xff0c;还可能影响企业声誉、客户信任&#xff0c;甚至可能引发法律纠纷。为了有效防止信息泄露&#xf…

使用 SQLmap 自动化检测 SQL 注入

使用 SQLmap 自动化检测 SQL 注入是一种常见的渗透测试技术。SQLmap 是一个强大的开源工具&#xff0c;可以自动检测和利用 SQL 注入漏洞&#xff0c;提取数据库信息&#xff0c;并接管目标数据库服务器。下面是如何使用 SQLmap 进行自动化检测 SQL 注入的基本步骤。 准备环境…

RabbitMQ 入门(七)SpringAMQP五种消息类型

一、Topic Exchange&#xff08;消息模式&#xff09; TopicExchange 与DirectExchange类似&#xff0c;区别在于routingKey可以是多个单词的列表&#xff0c;并且以.分割。 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过…

Spring WebFlux 核心原理(2-1)

1、Spring 响应式编程 1.1、早期响应式解决方案 响应式编程是构建响应式系统的主要候选方案。Spring 4.x 引入了 ListenableFuture 类&#xff0c;它扩展了 Java Future&#xff0c;并且可以基于 HTTP 请求实现异步执行操作。但是只有少数 Spring 4.x 组件支持新的 Java 8 Com…

Nginx(Linux):服务器版本升级和新增模块

目录 1、概述2、使用Nginx服务信号完成Nginx升级2.1 备份当前版本的Nginx2.2 向服务器导入新的Nginx2.3 向服务器导入新的Nginx2.4 停止老版本Nginx 3、使用Nginx安装目录的make命令完成升级3.1 备份当前版本的Nginx3.2 向服务器导入新的Nginx3.3 执行更新命令 1、概述 如果想…

24最新ComfyUI插件与Lora的下载及使用指南!

前言 本节我们介绍ComfyUI插件和Lora的下载及使用方式。 1. 安装 1.1 Checkpoint安装 将从前面介绍的模型下载平台下载后&#xff0c;放在ComfyUI/models/checkpoints文件夹下。 所有的AI设计工具&#xff0c;安装包、模型和插件&#xff0c;都已经整理好了&#xff0c;&am…

【vue自定义指令】骨架屏指令

场景 预加载的过程中&#xff0c;数据还未请求到&#xff0c;dom已经渲染出来了&#xff1f; 展示效果 实现 封装指令&#xff08;代码块1&#xff09; app引入&#xff08;代码块2&#xff09;使用&#xff08;代码块3&#xff09; 代码 封装 ​ import { reactive, wa…

Spark全网最全总结

Spark 产生之前&#xff0c;已经有 MapReduce 这类非常成熟的计算系统存在了&#xff0c;并提供 了高层次的 API(map/reduce)&#xff0c;把计算运行在集群中并提供容错能力&#xff0c;从而实现 分布式计算。 虽然 MapReduce 提供了对数据访问和计算的抽象&#xff0c…

一个月学会Java 第13天 抽象类与接口

Day13 抽象类与接口 通过了前面的学习&#xff0c;我们已经掌握了面向对象的基础 继承 封装 多态 第一章 抽象类 接下来&#xff0c;我们要对面向对象学习高级的部分&#xff0c;我们先要学到的就是抽象类&#xff0c;听名字也能想到&#xff0c;肯定很抽象&#xff0c;那我们先…

电力电子技术(二)

三相可控整流电路&#xff1a;&#xff08;主要包括三相半波和三相桥式&#xff09; &#xff08;一&#xff09;三相半波&#xff1a; &#xff08;1.1电阻性负载&#xff09; 右侧第三个图代表VT1晶闸管的流经电流波形&#xff0c;一个周期仅导通一次&#xff1a;晶闸管导…

Netty讲解与案例

1.Netty简介&#xff1a; 官网&#xff1a;https://netty.io/ Netty 是一个 NIO 客户端服务器框架&#xff0c;可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和精简了 TCP 和 UDP 套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序会存在…

Halcon 使用二维像素分类对图像进行分割

文章目录 算子histo_2dim 计算双通道灰度值图像的直方图class_2dim_sup 使用二维像素分类对图像进行分割 示例 算子 histo_2dim 计算双通道灰度值图像的直方图 histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )Regions (输入对象)&#xff1a;在此区域内计算直方图…

腾讯云视立方开通各项云服务相关

云直播 如何开通云直播服务&#xff1f; 进入 云直播管理控制台&#xff0c;进入腾讯云直播服务开通页&#xff0c;查看相关协议并勾选同意&#xff0c;单击申请开通即可开通云直播服务。 。 如何开启流防盗链 KEY&#xff1f; 推流防盗链 KEY 是为了确保只有您的 App 用户…

dockerfile 用法全解析

FROM 构建基于alpine的镜像&#xff0c;单条执行就是复制了一个apline镜像(除了FROM其他都是非必须的) WORKDIR 是之指定接下来的shell语句是运行在哪个路径下&#xff0c;没有就会创建目录 COPY 将宿主机指定目录的文件拷贝到镜像指定目录 &#xff08;ADD 源地址还可以url…