首页 > 编程语言 >CUDA编程【5】获取GPU设备信息

CUDA编程【5】获取GPU设备信息

时间:2025-01-03 13:29:23浏览次数:8  
标签:std deviceId cout 编程 获取 CUDA GPU cudaDeviceGetAttribute 设备

文章目录

通过cuda API获取

CUDA 提供了一系列 API 来查询设备的硬件信息、性能特性和限制。以下是一些常用的获取设备信息的 API:


1. 获取设备数量

使用 cudaGetDeviceCount 可以获取系统中可用的 CUDA 设备数量。

int deviceCount = 0;
cudaGetDeviceCount(&deviceCount);
std::cout << "Number of CUDA devices: " << deviceCount << std::endl;

2. 获取当前设备 ID

使用 cudaGetDevice 可以获取当前正在使用的设备 ID。

int currentDevice = 0;
cudaGetDevice(&currentDevice);
std::cout << "Current device ID: " << currentDevice << std::endl;

3. 设置当前设备

使用 cudaSetDevice 可以设置当前使用的设备。

int deviceId = 0; // 设置设备 ID
cudaSetDevice(deviceId);

4. 获取设备属性

使用 cudaGetDeviceProperties 可以获取设备的详细属性信息,包括硬件特性、计算能力、内存大小等。

cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, deviceId); // deviceId 是设备 ID

std::cout << "Device Name: " << deviceProp.name << std::endl;
std::cout << "Compute Capability: " << deviceProp.major << "." << deviceProp.minor << std::endl;
std::cout << "Total Global Memory: " << deviceProp.totalGlobalMem / (1024 * 1024) << " MB" << std::endl;
std::cout << "Max Threads per Block: " << deviceProp.maxThreadsPerBlock << std::endl;
std::cout << "Max Threads Dim: (" << deviceProp.maxThreadsDim[0] << ", "
          << deviceProp.maxThreadsDim[1] << ", " << deviceProp.maxThreadsDim[2] << ")" << std::endl;
std::cout << "Max Grid Size: (" << deviceProp.maxGridSize[0] << ", "
          << deviceProp.maxGridSize[1] << ", " << deviceProp.maxGridSize[2] << ")" << std::endl;
std::cout << "Warp Size: " << deviceProp.warpSize << std::endl;
std::cout << "Multiprocessor Count: " << deviceProp.multiProcessorCount << std::endl;

5. 获取设备限制

使用 cudaDeviceGetLimit 可以获取设备的资源限制,例如栈大小、堆大小等。

size_t stackSize = 0;
cudaDeviceGetLimit(&stackSize, cudaLimitStackSize);
std::cout << "Stack Size Limit: " << stackSize << " bytes" << std::endl;

size_t heapSize = 0;
cudaDeviceGetLimit(&heapSize, cudaLimitMallocHeapSize);
std::cout << "Heap Size Limit: " << heapSize << " bytes" << std::endl;

6. 获取设备共享内存配置

使用 cudaDeviceGetSharedMemConfig 可以获取设备的共享内存配置(4 字节或 8 字节 bank 大小)。

cudaSharedMemConfig config;
cudaDeviceGetSharedMemConfig(&config);
if (config == cudaSharedMemBankSizeFourByte) {
    std::cout << "Shared Memory Bank Size: 4 bytes" << std::endl;
} else if (config == cudaSharedMemBankSizeEightByte) {
    std::cout << "Shared Memory Bank Size: 8 bytes" << std::endl;
}

7. 获取设备缓存配置

使用 cudaDeviceGetCacheConfig 可以获取设备的 L1 缓存和共享内存的配置。

cudaFuncCache cacheConfig;
cudaDeviceGetCacheConfig(&cacheConfig);
switch (cacheConfig) {
    case cudaFuncCachePreferNone:
        std::cout << "Cache Config: Prefer None" << std::endl;
        break;
    case cudaFuncCachePreferShared:
        std::cout << "Cache Config: Prefer Shared Memory" << std::endl;
        break;
    case cudaFuncCachePreferL1:
        std::cout << "Cache Config: Prefer L1 Cache" << std::endl;
        break;
    case cudaFuncCachePreferEqual:
        std::cout << "Cache Config: Prefer Equal L1 and Shared Memory" << std::endl;
        break;
}

8. 获取设备是否支持统一内存

使用 cudaDeviceGetAttribute 可以查询设备是否支持统一内存(Unified Memory)。

int unifiedAddressing = 0;
cudaDeviceGetAttribute(&unifiedAddressing, cudaDevAttrUnifiedAddressing, deviceId);
if (unifiedAddressing) {
    std::cout << "Device supports Unified Memory" << std::endl;
} else {
    std::cout << "Device does not support Unified Memory" << std::endl;
}

9. 获取设备是否支持并发内核执行

使用 cudaDeviceGetAttribute 可以查询设备是否支持并发内核执行。

int concurrentKernels = 0;
cudaDeviceGetAttribute(&concurrentKernels, cudaDevAttrConcurrentKernels, deviceId);
if (concurrentKernels) {
    std::cout << "Device supports Concurrent Kernel Execution" << std::endl;
} else {
    std::cout << "Device does not support Concurrent Kernel Execution" << std::endl;
}

10. 获取设备的最大线程块数

使用 cudaDeviceGetAttribute 可以查询设备的最大线程块数。

int maxBlocks = 0;
cudaDeviceGetAttribute(&maxBlocks, cudaDevAttrMaxBlocksPerMultiprocessor, deviceId);
std::cout << "Max Blocks per Multiprocessor: " << maxBlocks << std::endl;

11. 获取设备的时钟频率

使用 cudaDeviceGetAttribute 可以查询设备的时钟频率。

int clockRate = 0;
cudaDeviceGetAttribute(&clockRate, cudaDevAttrClockRate, deviceId);
std::cout << "Device Clock Rate: " << clockRate << " kHz" << std::endl;

12. 获取设备的内存时钟频率

使用 cudaDeviceGetAttribute 可以查询设备的内存时钟频率。

int memoryClockRate = 0;
cudaDeviceGetAttribute(&memoryClockRate, cudaDevAttrMemoryClockRate, deviceId);
std::cout << "Memory Clock Rate: " << memoryClockRate << " kHz" << std::endl;

13. 获取设备的总显存大小

使用 cudaDeviceGetAttribute 可以查询设备的总显存大小。

size_t totalMemory = 0;
cudaDeviceGetAttribute(&totalMemory, cudaDevAttrTotalMemory, deviceId);
std::cout << "Total Device Memory: " << totalMemory / (1024 * 1024) << " MB" << std::endl;

案例

#include <iostream>
#include <cuda_runtime.h>

// 打印设备信息的函数
void printDeviceInfo(int deviceId) {
    cudaDeviceProp deviceProp;
    cudaGetDeviceProperties(&deviceProp, deviceId);

    std::cout << "Device " << deviceId << ": " << deviceProp.name << std::endl;
    std::cout << "  Compute Capability: " << deviceProp.major << "." << deviceProp.minor << std::endl;
    std::cout << "  Total Global Memory: " << deviceProp.totalGlobalMem / (1024 * 1024) << " MB" << std::endl;
    std::cout << "  Shared Memory per Block: " << deviceProp.sharedMemPerBlock / 1024 << " KB" << std::endl;
    std::cout << "  Registers per Block: " << deviceProp.regsPerBlock << std::endl;
    std::cout << "  Warp Size: " << deviceProp.warpSize << std::endl;
    std::cout << "  Max Threads per Block: " << deviceProp.maxThreadsPerBlock << std::endl;
    std::cout << "  Max Threads Dim: (" << deviceProp.maxThreadsDim[0] << ", "
              << deviceProp.maxThreadsDim[1] << ", " << deviceProp.maxThreadsDim[2] << ")" << std::endl;
    std::cout << "  Max Grid Size: (" << deviceProp.maxGridSize[0] << ", "
              << deviceProp.maxGridSize[1] << ", " << deviceProp.maxGridSize[2] << ")" << std::endl;
    std::cout << "  Multiprocessor Count: " << deviceProp.multiProcessorCount << std::endl;
    std::cout << "  Clock Rate: " << deviceProp.clockRate / 1000 << " MHz" << std::endl;
    std::cout << "  Memory Clock Rate: " << deviceProp.memoryClockRate / 1000 << " MHz" << std::endl;
    std::cout << "  Memory Bus Width: " << deviceProp.memoryBusWidth << " bits" << std::endl;
    std::cout << "  L2 Cache Size: " << deviceProp.l2CacheSize / 1024 << " KB" << std::endl;
    std::cout << "  Max Texture Dimensions: (" << deviceProp.maxTexture1D << ", "
              << deviceProp.maxTexture2D[0] << "x" << deviceProp.maxTexture2D[1] << ", "
              << deviceProp.maxTexture3D[0] << "x" << deviceProp.maxTexture3D[1] << "x" << deviceProp.maxTexture3D[2] << ")" << std::endl;
    std::cout << "  Unified Addressing: " << (deviceProp.unifiedAddressing ? "Yes" : "No") << std::endl;
    std::cout << "  Concurrent Kernels: " << (deviceProp.concurrentKernels ? "Yes" : "No") << std::endl;
    std::cout << "  ECC Enabled: " << (deviceProp.ECCEnabled ? "Yes" : "No") << std::endl;
    std::cout << "  PCI Bus ID: " << deviceProp.pciBusID << std::endl;
    std::cout << "  PCI Device ID: " << deviceProp.pciDeviceID << std::endl;
    std::cout << "  PCI Domain ID: " << deviceProp.pciDomainID << std::endl;
    std::cout << std::endl;
}

int main() {
    // 获取设备数量
    int deviceCount = 0;
    cudaGetDeviceCount(&deviceCount);
    if (deviceCount == 0) {
        std::cerr << "No CUDA devices found!" << std::endl;
        return 1;
    }
    std::cout << "Number of CUDA devices: " << deviceCount << std::endl;

    // 获取当前设备 ID
    int currentDevice = 0;
    cudaGetDevice(&currentDevice);
    std::cout << "Current device ID: " << currentDevice << std::endl;

    // 打印每个设备的详细信息
    for (int deviceId = 0; deviceId < deviceCount; deviceId++) {
        printDeviceInfo(deviceId);
    }

    return 0;
}
Number of CUDA devices: 2
Current device ID: 0

Device 0: NVIDIA GeForce RTX 3080
  Compute Capability: 8.6
  Total Global Memory: 10240 MB
  Shared Memory per Block: 48 KB
  Registers per Block: 65536
  Warp Size: 32
  Max Threads per Block: 1024
  Max Threads Dim: (1024, 1024, 64)
  Max Grid Size: (2147483647, 65535, 65535)
  Multiprocessor Count: 68
  Clock Rate: 1710 MHz
  Memory Clock Rate: 9500 MHz
  Memory Bus Width: 320 bits
  L2 Cache Size: 5120 KB
  Max Texture Dimensions: (131072, 131072x65536, 16384x16384x16384)
  Unified Addressing: Yes
  Concurrent Kernels: Yes
  ECC Enabled: No
  PCI Bus ID: 1
  PCI Device ID: 0
  PCI Domain ID: 0

Device 1: NVIDIA Quadro P4000
  Compute Capability: 6.1
  Total Global Memory: 8192 MB
  Shared Memory per Block: 48 KB
  Registers per Block: 65536
  Warp Size: 32
  Max Threads per Block: 1024
  Max Threads Dim: (1024, 1024, 64)
  Max Grid Size: (2147483647, 65535, 65535)
  Multiprocessor Count: 14
  Clock Rate: 1480 MHz
  Memory Clock Rate: 7600 MHz
  Memory Bus Width: 256 bits
  L2 Cache Size: 2048 KB
  Max Texture Dimensions: (131072, 131072x65536, 16384x16384x16384)
  Unified Addressing: Yes
  Concurrent Kernels: Yes
  ECC Enabled: No
  PCI Bus ID: 2
  PCI Device ID: 0
  PCI Domain ID: 0

通过nvidia-smi获取

标签:std,deviceId,cout,编程,获取,CUDA,GPU,cudaDeviceGetAttribute,设备
From: https://blog.csdn.net/qq_42681630/article/details/144908212

相关文章

  • 断点&输出大法快速定位编程错误
    断点&输出大法快速定位编程错误1、断点法点红框位置就可以加每行代码的断点再按F5进行debug操作,在下面的窗口看各函数的值这种方法经常用在循环出现问题时进行处理举个栗子比方说现在输出的结果非常烫,但是由于代码复杂程度较高,不好分析#include<iostream>usingnamespac......
  • 面向对象编程(OOP)
    在计算机编程的广阔领域中,面向对象编程(Object-OrientedProgramming,简称OOP)占据着举足轻重的地位,它为软件开发提供了一种高效、灵活且易于维护的编程范式,深刻地影响着现代软件的设计与开发方式。从桌面应用程序到大型企业级系统,从移动应用到网页开发,OOP的理念和技术随处可见,......
  • AI 自动化编程对编程教育的影响
    AI自动化编程的未来引言你是否曾想过,未来的程序员需要掌握哪些技能呢?随着人工智能的迅猛发展,特别是生成式AI工具的普及,编程的世界正在发生翻天覆地的变化。编程教育也在这种环境下进行着深刻的转型。那么,AI自动化编程究竟会如何影响编程教育呢?在这篇文章中,我们将一起探......
  • 编译CUDA时的ARCH参数
    https://blog.csdn.net/Vingnir/article/details/135255072在编译CUDA程序时,ARCH是指定给nvcc(NVIDIACUDACompiler)的一个重要参数。ARCH代表着目标GPU的计算能力(ComputeCapability),这是一个特定于NVIDIAGPU架构的指标,用于表明GPU支持的特性和指令集。关于CUDA计算能力(Com......
  • 在Lazarus下的Free Pascal编程教程——以数据需求拉动程序运行的模块化程序设计方法
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“2.已......
  • 在Lazarus下的Free Pascal编程教程——按数据流程规划程序结构
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”和“2.已经......
  • 一文带你入门仓颉编程语言(上)
    目录一、引言:仓颉编程的崛起二、编程环境搭建全攻略三、基础语法精析(一)变量与数据类型(二)表达式与流程控制四、函数:代码复用的利器(一)普通函数(二)Lambda表达式  一、引言:仓颉编程的崛起2024年6月21日下午,华为终端BG软件部总裁龚体先生在华为开发者大会主题演讲《......
  • 仓颉编程语言:编程世界的 “文化瑰宝”
    我的个人主页在当今编程领域百花齐放的时代,各种编程语言争奇斗艳,服务于不同的应用场景和开发者群体。然而,有这样一种编程语言,它承载着独特的文化内涵,宛如编程世界里一颗熠熠生辉的“文化瑰宝”,那就是仓颉编程语言。一、仓颉编程语言的渊源仓颉,本是传说中创造汉字的......
  • 会打字,就会编程!
    大家好!我是羊仔,专注AI工具、编程、智能体。最近羊仔发现一个超级好用的AI工具——Cursor。这是一个能让编程小白也能做出专业级别网站的神器,它颠覆了现有的编程方式,只需要和AI聊天就可以了!也就是说,人人都会编程!用上Cursor后,你不需要再学Python了!一、8岁“小程序员”的故事......
  • C# 编程系列:网络通信之TCP通信(第五篇:在线五子棋)
      欢迎阅读本系列教程——《C#编程系列:网络通信之TCP通信》。作为.NET开发者,掌握TCP/IP协议和其在C#中的应用,对于构建稳定、高效的网络应用程序至关重要。  本系列教程面向有一定C#基础,希望深入了解网络通信,特别是TCP通信的开发者。本系列都将为您提供全面指导。本系......