IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> VS2017 CUDA编程学习3:CUDA获取设备上属性信息 -> 正文阅读

[人工智能]VS2017 CUDA编程学习3:CUDA获取设备上属性信息


VS2017 CUDA编程学习1:CUDA编程两变量加法运算
VS2017 CUDA编程学习2:在GPU上执行线程


前言

今天学习了如何使用CUDA获取GPU设备上属性信息,这里做个学习笔记并分享给大家。


1. 学习内容

CUDA获取设备数量与设备名称,CUDA获取设备通用属性信息,CUDA获取设备内存相关属性信息,CUDA获取设备线程相关属性信息等。


2. VS2017 CUDA代码实现

#include <stdio.h>
#include <iostream>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <memory>

int main()
{
	//1. 获取CUDA支持的设备数量
	int device_count = 0;
	// get the count of number of CUDA enable devices , if no CUDA capable devices, get 0
	cudaGetDeviceCount(&device_count);

	if (device_count == 0)
	{
		std::cout << "There are no available device(s) that support CUDA" << std::endl;
	}
	else
	{
		std::cout << "Detected < " << device_count <<" > CUDA Capable device(s)\n" << std::endl;
	}

	// 2. GPU通用属性信息
	cudaDeviceProp device_Property;
	int device = 0;
	cudaGetDevice(&device);
	cudaGetDeviceProperties(&device_Property, device);
	printf("Device %d: \"%s\"\n", device, device_Property.name);

	int driverVersion = 0;
	int runtimeVersion = 0;

	cudaDriverGetVersion(&driverVersion);
	cudaRuntimeGetVersion(&runtimeVersion);
	printf("CUDA Driver Version / Runtime Version %d.%d / %d.%d\n", driverVersion / 1000,
		(driverVersion % 100) / 10, runtimeVersion / 1000, (runtimeVersion % 100) / 10);
	
	printf("(%2d) Multiprocessors\n", device_Property.multiProcessorCount);

	printf("GPU Max Clock rate: %.0f MHz(%0.2f GHz)\n", device_Property.clockRate * 1e-3f, device_Property.clockRate * 1e-6f);

	// 3. GPU内存相关属性
	// GPU内存为分层结构,分为L1缓存, L2缓存,全局内存,纹理内存和共享内存

	//全局内存大小
	printf("Total amount of global memory: %.0f MBytes(%llu bytes)\n",
		(float)device_Property.totalGlobalMem / 1048576.0f, (unsigned long long)device_Property.totalGlobalMem);

	//显存频率
	printf("Memory Clock rate: %.0f MHz\n", device_Property.memoryClockRate * 1e-3f);

	//显存带宽
	printf("Memory Bus Width: %d-bit\n", device_Property.memoryBusWidth);

	//L2缓存大小
	if (device_Property.l2CacheSize)
	{
		printf("L2 Cache Size : %d bytes\n", device_Property.l2CacheSize);
	}

	//设备中总常量显存
	printf("Total amount of constant memory: %lu bytes\n", device_Property.totalConstMem);

	//设备中每个块的最大可用共享缓存
	printf("Total amount of shared memory per block: %lu bytes\n", device_Property.sharedMemPerBlock);

	//设备中每个块最大可用寄存器数量
	printf("Total number of registers available per block: %d\n", device_Property.regsPerBlock);

	//4. 线程相关属性

	//块和线程可以是多维的,最好知道每个维度中可以并行启动多少线程和块,每个多处理器的线程数量和每个块的线程数量有限制
	//在内核参数配置中,如果每个块中启动的线程数量超过每个块中可能的最大线程数量,则程序可能崩溃。

	//每个多处理器线程数量
	printf("Maximum number of threads per multiprocessor: %d\n", device_Property.maxThreadsPerMultiProcessor);

	//每个块最大线程数
	printf("Maximum number of threads per block: %d\n", device_Property.maxThreadsPerBlock);

	//每个块中各个维度最大线程数量
	printf("Max dimension size of a thread block (x, y, z):(%d, %d, %d)\n",
		device_Property.maxThreadsDim[0],
		device_Property.maxThreadsDim[1],
		device_Property.maxThreadsDim[2]);

	//每个维度中每个网格的最大维度大小
	printf("Max dimension size of a grid size (x, y, z): (%d, %d, %d)\n",
		device_Property.maxGridSize[0],
		device_Property.maxGridSize[1],
		device_Property.maxGridSize[2]);

	//为什么要了解设备属性呢?答案就是如果有多个GPU设备,将帮助选择更多多处理的GPU设备

	//设备属性的一种用法:假设有一个应用程序,要求双精度浮点操作。并不是所有的GPU设备都支持这种操作。
	//确定设备是否支持双精度浮点操作并为应用程序设置该设备
	int device1;
	cudaGetDevice(&device1);

	cudaDeviceProp deviceProp;
	memset(&deviceProp, 0, sizeof(cudaDeviceProp));
	//major > 1 && minor > 3, 该设备支持双精度操作
	deviceProp.major = 1;
	deviceProp.minor = 3;
	cudaChooseDevice(&device1, &deviceProp);
	printf("ID of device which support double precision is :%d\n",
		device1);
	cudaSetDevice(device1);

	system("pause");
	return 0;
}

总结

这次主要是学习使用CUDA获取GPU设备属性信息,这在多GPU设备选择以及设备内核参数配置方面很重要,如果配置内核参数超出设备限制,程序可能崩溃!


学习资料

《基于GPU加速的计算机视觉编程》

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-10-11 17:31:30  更:2021-10-11 17:32:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 10:39:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码