使用代码获取GPU的信息

128 阅读2分钟

在当今计算领域中,图形处理器(GPU)因其强大的并行计算能力而备受瞩目,而 CUDA(Cumpute Unified Device Architecture)作为 NVIDIA 提供的并行计算平台和编程模型,更是成为了利用 GPU 进行高性能计算的关键技术。

对于初学者而言,CUDA 的入门可能会显得有些复杂。不过,通过一个简单的代码示例,可以快速了解和探索 GPU 的基本属性。

代码初探:了解CUDA设备

#include <stdio.h>
#include <cuda_runtime.h>

int main(){
    cudaDeviceProp prop;
    cudaGetDeviceProperties(&prop, 0);

    // 获取设备名称
    printf("Device Name: %s\n", prop.name);
    // 获取计算能力
    printf("Compute Capability: %d.%d\n", prop.major, prop.minor);
    // 获取每个线程块的最大线程数
    printf("Max threads Per Block: %d\n", prop.maxThreadsPerBlock);
    // 获取线程块的最大维度
    printf("Max Block Dimensions: (%d, %d, %d)\n", prop.maxThreadsDim[0],prop.maxThreadsDim[1], prop.maxThreadsDim[2]);
    // 获取网格的最大维度
    printf("Max Grid Dimensions: (%d, %d, %d)\n", prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]);
    // 获取多处理器数量
    printf("Multiprocessors (SMs): %d\n", prop.multiProcessorCount);
}

代码解析

    cudaDeviceProp prop;
    cudaGetDeviceProperties(&prop, 0);

在这个代码中,我们声明了一个cudaDeviceProp类型的变量prop,并调用cudaGetDeviceProperries函数来获取设备编号为0的属性。注意,这里的0表示系统中的第一个 CUDA 设备。

接下来我们可以看一下设备信息:

prop.name,设备名称,包含制造商和型号信息。

prop.majorprop.minor,计算能力的版本号,由两个数字组成,前者表示主要版本,后者表示次要版本。注意,这里并不是简单的版本号,计算能力决定了设别的功能和对 CUDA 内核的支持程度。

prop.maxThreadsPerBlock,每个线程块(Block)可以容纳的最大线程数。线程块是 CUDA 内核中并行执行的基本单元。

prop.maxThreadsDim,线程块在三维空间中的最大维度,分别表示x,y,z 三个方向上的线程数上限。

prop.maxGridSize,网格(Grid)的最大维度,表示网格在三维空间中可以容纳的最大线程块数。

prop.multiProcessorCount,流多处理器(Straming Multiprocessors,简称SMs)的数量,每个 SM 由多个 CUDA 核心组成,是 GPU 运行 CUDA 内核的基本计算单元。

编译与运行

在编译和运行这个程序之前,请确保你以及安装了CUDA Toolkit,并且配置了正确的环境变量。

编译:

nvcc -o device_properties device_properties.cu

运行:

./device_properties

输出

Device Name: NVIDIA GeForce RTX 4070 Laptop GPU
Compute Capability: 8.9
Max threads Per Block: 1024
Max Block Dimensions: (1024, 1024, 64)
Max Grid Dimensions: (2147483647, 65535, 65535)
Multiprocessors (SMs): 36