CUDA Samples: 获取设备属性信息
通过调用CUDA的cudaGetDeviceProperties函数可以获得指定设备的相关信息,此函数会根据GPU显卡和CUDA版本的不同得到的结果也有所差异,下面code列出了经常用到的设备信息:
#include "funset.hpp"
#include <iostream>
#include <cuda_runtime.h> // For the CUDA runtime routines (prefixed with "cuda_")
#include <device_launch_parameters.h>
/* reference:
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\1_Utilities\deviceQuery
*/
int get_device_info()
{
int device_count{ 0 };
// cudaGetDeviceCount: 获得计算能力设备的数量
cudaGetDeviceCount(&device_count);
fprintf(stdout, "GPU设备的数量: %d\n", device_count);
for (int dev = 0; dev < device_count; ++dev) {
int driver_version{ 0 }, runtime_version{ 0 };
/* cudaSetDevice: 设置GPU执行时使用的设备,0表示能搜索到的第一
个设备号,如果有多个设备,则编号为0,1,2... */
cudaSetDevice(dev);
/* cudaDeviceProp: 设备属性结构体
name: 设备名字,如GeForce 940MX
totalGlobalMem: 设备上可用的全局内存总量(字节)
sharedMemPerBlock: 每一个线程块上可用的共享内存总量(字节)
regsPerBlock: 每一个线程块上可用的32位寄存器数量
warpSize: 一个线程束包含的线程数量,在实际运行中,线程块会被分割成更小的线程束(warp),
线程束中的每个线程都将在不同数据上执行相同的命令
memPitch: 在内存拷贝中允许的最大pitch数(字节)
maxThreadsPerBlock: 每一个线程块中支持的最大线程数量
maxThreadsDim[3]: 每一个线程块的每个维度的最大大小(x,y,z)
maxGridSize: 每一个线程格的每个维度的最大大小(x,y,z)
clockRate: GPU最大时钟频率(千赫兹)
totalConstMem: 设备上可用的常量内存总量(字节)
major: 设备计算能力主版本号,设备计算能力的版本描述了一种GPU对CUDA功能的支持程度
minor: 设备计算能力次版本号
textureAlignment: 纹理对齐要求
deviceOverlap: GPU是否支持设备重叠(Device Overlap)功能,支持设备重叠功能的GPU能够
在执行一个CUDA C核函数的同时,还能在设备与主机之间执行复制等操作,
已废弃,使用asyncEngineCount代替
multiProcessorCount: 设备上多处理器的数量
kernelExecTimeoutEnabled: 指定执行核函数时是否有运行时间限制
integrated: 设备是否是一个集成GPU
canMapHostMemory: 设备是否支持映射主机内存,可作为是否支持零拷贝内存的判断条件
computeMode: CUDA设备计算模式,可参考cudaComputeMode
maxTexture1D: 一维纹理支持的最大大小
maxTexture2D[2]:二维纹理支持的最大大小(x,y)
maxTexture3D[3]: 三维纹理支持的最大大小(x,y,z)
memoryClockRate: 内存时钟频率峰值(千赫兹)
memoryBusWidth: 全局内存总线宽度(bits)
l2CacheSize: L2缓存大小(字节)
maxThreadsPerMultiProcessor: 每个多处理器支持的最大线程数量
concurrentKernels: 设备是否支持同时执行多个核函数
asyncEngineCount: 异步引擎数量
unifiedAddressing: 是否支持设备与主机共享一个统一的地址空间
*/
cudaDeviceProp device_prop;
/* cudaGetDeviceProperties: 获取指定的GPU设备属性相关信息 */
cudaGetDeviceProperties(&device_prop, dev);
fprintf(stdout, "\n设备 %d 名字: %s\n", dev, device_prop.name);
/* cudaDriverGetVersion: 获取CUDA驱动版本 */
cudaDriverGetVersion(&driver_version);
fprintf(stdout, "CUDA驱动版本: %d.%d\n", driver_version/1000, (driver_version%1000)/10);
/* cudaRuntimeGetVersion: 获取CUDA运行时版本 */
cudaRuntimeGetVersion(&runtime_version);
fprintf(stdout, "CUDA运行时版本: %d.%d\n", runtime_version/1000, (runtime_version%1000)/10);
fprintf(stdout, "设备计算能力: %d.%d\n", device_prop.major, device_prop.minor);
fprintf(stdout, "设备上可用的全局内存总量: %f MB, %llu bytes\n",
(float)device_prop.totalGlobalMem / (1024 * 1024), (unsigned long long)device_prop.totalGlobalMem);
fprintf(stdout, "每一个线程块上可用的共享内存总量: %f KB, %lu bytes\n",
(float)device_prop.sharedMemPerBlock / 1024, device_prop.sharedMemPerBlock);
fprintf(stdout, "每一个线程块上可用的32位寄存器数量: %d\n", device_prop.regsPerBlock);
fprintf(stdout, "一个线程束包含的线程数量: %d\n", device_prop.warpSize);
fprintf(stdout, "在内存拷贝中允许的最大pitch数: %d bytes\n", device_prop.memPitch);
fprintf(stdout, "每一个线程块中支持的最大线程数量: %d\n", device_prop.maxThreadsPerBlock);
fprintf(stdout, "每一个线程块的每个维度的最大大小(x,y,z): (%d, %d, %d)\n",
device_prop.maxThreadsDim[0], device_prop.maxThreadsDim[1], device_prop.maxThreadsDim[2]);
fprintf(stdout, "每一个线程格的每个维度的最大大小(x,y,z): (%d, %d, %d)\n",
device_prop.maxGridSize[0], device_prop.maxGridSize[1], device_prop.maxGridSize[2]);
fprintf(stdout, "GPU最大时钟频率: %.0f MHz (%0.2f GHz)\n",
device_prop.clockRate*1e-3f, device_prop.clockRate*1e-6f);
fprintf(stdout, "设备上可用的常量内存总量: %lu bytes\n", device_prop.totalConstMem);
fprintf(stdout, "纹理对齐要求: %lu bytes\n", device_prop.textureAlignment);
fprintf(stdout, "是否支持设备重叠功能: %s\n", device_prop.deviceOverlap ? "Yes" : "No");
fprintf(stdout, "设备上多处理器的数量: %d\n", device_prop.multiProcessorCount);
fprintf(stdout, "执行核函数时是否有运行时间限制: %s\n", device_prop.kernelExecTimeoutEnabled ? "Yes" : "No");
fprintf(stdout, "设备是否是一个集成GPU: %s\n", device_prop.integrated ? "Yes" : "No");
fprintf(stdout, "设备是否支持映射主机内存: %s\n", device_prop.canMapHostMemory ? "Yes" : "No");
fprintf(stdout, "CUDA设备计算模式: %d\n", device_prop.computeMode);
fprintf(stdout, "一维纹理支持的最大大小: %d\n", device_prop.maxTexture1D);
fprintf(stdout, "二维纹理支持的最大大小(x,y): (%d, %d)\n", device_prop.maxTexture2D[0], device_prop.maxSurface2D[1]);
fprintf(stdout, "三维纹理支持的最大大小(x,y,z): (%d, %d, %d)\n",
device_prop.maxTexture3D[0], device_prop.maxSurface3D[1], device_prop.maxSurface3D[2]);
fprintf(stdout, "内存时钟频率峰值: %.0f Mhz\n", device_prop.memoryClockRate * 1e-3f);
fprintf(stdout, "全局内存总线宽度: %d bits\n", device_prop.memoryBusWidth);
fprintf(stdout, "L2缓存大小: %d bytes\n", device_prop.l2CacheSize);
fprintf(stdout, "每个多处理器支持的最大线程数量: %d\n", device_prop.maxThreadsPerMultiProcessor);
fprintf(stdout, "设备是否支持同时执行多个核函数: %s\n", device_prop.concurrentKernels ? "Yes" : "No");
fprintf(stdout, "异步引擎数量: %d\n", device_prop.asyncEngineCount);
fprintf(stdout, "是否支持设备与主机共享一个统一的地址空间: %s\n", device_prop.unifiedAddressing ? "Yes" : "No");
}
return 0;
}
执行结果如下:
GitHub:https://github.com/fengbingchun/CUDA_Test
CUDA Samples: 获取设备属性信息的更多相关文章
- linux驱动之获取设备树信息
上一篇文章学习了字符设备的注册,操作过的小伙伴都知道上一篇文章中测试驱动时是通过手动创建设备节点的,现在开始学习怎么自动挂载设备节点和设备树信息的获取,这篇文章中的源码将会是我以后编写字符驱动的模板. ...
- mysql根据身份证信息来获取用户属性信息
需要:根据身份证信息来获取用户属性 方法:可以使用如下sql语句: ) ' then '北京市' ' then '天津市' ' then '河北省' ' then '山西省' ' then '内蒙古自 ...
- android获取设备全部信息
private static final String FILE_MEMORY = "/proc/meminfo"; private static final String FIL ...
- iOS开发-获取设备型号信息
开发中有的时候查看设计统计数据,或者通过日志查看错误信息,这个时候我们就需要获取获取设备信息,看下关于设备有几种方法: NSLog(@"%@",[[UIDevice current ...
- [Android]获取设备相关信息
public static int screenWidth(Activity activity) { DisplayMetrics dm = new DisplayMetrics(); activit ...
- ios获取设备信息总结
1.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名 ...
- 定义通用的可通过lambda表达式树来获取属性信息
我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定 ...
- 【Windows 8 Store App】学习一:获取设备信息
原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093306.html 通常情况下我们需要知道用户设备的一些信息:deviceId, os ...
- ios 获取设备相关的信息
.获取设备的信息 UIDevice *device = [[UIDevice alloc] int]; NSString *name = device.name; //获取设备所有者的名称 NSStr ...
随机推荐
- IIS Express 配置json minitype
IIS Express 配置json minitype 1.在命令窗口中cd到IIS Express安装目录,默认是“C:\Program Files\IIS Express”: 2.在IIS Exp ...
- python 函数返回函数
def hi(name="yasoob"): def greet(): return "now you are in the greet() function" ...
- ASP.NET MVC实现网站验证码功能
网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. 在 ...
- vuejs2点滴
在Vue定义一个不被添加getter setter 的属性: https://github.com/vuejs/vue/issues/1988 博客: 0.vux的x-input源码分析. http: ...
- 终于用ADB连上平板了
可以看到设备管理器里, ADB Interface 设备装不上驱动. 1,百度到的内容,没有一个靠谱的. 2,google到内容了, 却因为看的不仔细,浪费了好多时间...(android自己的文章都 ...
- jsp/servlet区别
简介: JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起建立的一种动态 ...
- [Java学习] Java虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
- 基因家族收缩和扩张分析 & Selective loss pathway & 泛基因组
套路 这通常就是基因组组装后的必做分析,通过比较基因组学的手段进行分析,可以知道所研究物种在进化过程中哪些核心基因家族发生了变化,从而导致了其特殊的适应性机制的形成. 参考: Extremotoler ...
- python3 操作windows的粘贴板(读取和传值)
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import win32con import wi ...
- Tree CodeForces - 1111E (树,计数,换根)
大意: 给定树, 多组询问, 每个询问给出一个点集$S$, 给定$m, r$, 求根为$r$时, $S$的划分数, 满足 每个划分大小不超过$m$ 每个划分内不存在一个点是另一个点的祖先 设点$x$的 ...