在当今计算领域中,图形处理器(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.major和prop.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