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;
}
执行结果如下:


GitHubhttps://github.com/fengbingchun/CUDA_Test

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA Fortran(也称为Fortran编程语言的CUDA扩展)是一种用于在GPU上执行并行计算的编程模型。CUDA Fortran提供了一种简单而高效的方式来开发并行GPU应用程序,尤其适用于科学计算和数值计算。 在CUDA Fortran中,设备端函数是在GPU上执行的函数。它们可以并行地在多个线程中执行,以加速计算。设备端函数由CUDA Fortran编写,在运行时在GPU上运行。与传统的Fortran函数不同,设备端函数可以通过使用CUDA语言扩展来利用GPU的并行特性。 在创建设备端函数时,我们需要使用特殊的编译器指令来标识这是一个设备端函数,例如`!$acc routine`。设备端函数的参数和返回值必须在设备内存中分配,并且必须使用特殊的语法进行传递。CUDA Fortran提供了一些内置函数和指令,用于操作设备内存和执行并行计算。 设备端函数通常与主机端函数(在CPU上执行的函数)结合使用,以实现在GPU和CPU之间的数据传输和计算分工。主机端函数负责数据的输入和输出,以及将计算任务分配给GPU。设备端函数执行实际的计算任务,并将结果传递回主机端函数。 总而言之,设备端函数是在GPU上执行的CUDA Fortran函数。它们可以实现并行计算,并与主机端函数相结合,以加速计算任务。CUDA Fortran为科学计算和数值计算提供了一种强大的编程模型,使开发者能够更好地利用GPU的并行计算能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值