设备属性
在 CUDA 编程中,我们可以了解和使用 GPU 的设备属性。这些属性提供了关于 CUDA 设备的详细属性,允许开发者根据设备的能力优化程序。
我们直接看到代码清单 1,了解如何查询设备属性。
cudaGetDeviceCount 函数用于获取系统中可用 CUDA 设备的数量。count 参数返回可用 CUDA 设备的数量。
- cudaError_t cudaGetDeviceCount(int* count);
cudaGetDeviceProperties 函数用于查询某个 CUDA 设备的详细属性。device 参数,指定要查询设备的索引号,从 0 开始计数。prop 参数是 cudaDeviceProp 结构体指针,里面包含了各种设备属性。
- cudaError_t cudaGetDeviceProperties(struct cudaDeviceProp *prop, int device);
- void query_device()
- {
- int deviceCount = 0;
- cudaGetDeviceCount(&deviceCount);
- if (deviceCount == 0)
- {
- fprintf(stderr, "No CUDA support device found\n");
- return;
- }
- int devNo = 0;
- cudaDeviceProp iProp;
- cudaGetDeviceProperties(&iProp, devNo);
- printf("Device %d: %s\n", devNo, iProp.name);
- printf(" Number of multiprocessors:\t%d\n", iProp.multiProcessorCount);
- printf(" Clock rate:\t%d\n", iProp.clockRate);
- printf(" Compute capability:\t%d.%d\n", iProp.major, iProp.minor);
- printf(" Total amount of global memory:\t%4.2f KB\n", iProp.totalGlobalMem / 1024.0);
- printf(" Total amount of constant memory:\t%4.2f KB\n", iProp.totalConstMem / 1024.0);
- printf(" Total amount of shared memory per block:\t%4.2f KB\n", iProp.sharedMemPerBlock / 1024.0);
- printf(" Total amount of shared memory per MP:\t%4.2f KB\n", iProp.sharedMemPerMultiprocessor / 1024.0);
- printf(" Total amount of registers available per block:\t%d\n", iProp.regsPerBlock);
- printf(" Warp size:\t%d\n", iProp.warpSize);
- printf(" Maximum number of threads per block:\t%d\n", iProp.maxThreadsPerBlock);
- printf(" Maximum number of threads per multiprocessor:\t%d\n", iProp.maxThreadsPerMultiProcessor);
- printf(" Maximum number of warps per multiprocessor:\t%d\n", iProp.maxThreadsPerMultiProcessor / 32);
- printf(" Maximum grid size:\t(%d,%d,%d)\n", iProp.maxGridSize[0], iProp.maxGridSize[1], iProp.maxGridSize[2]);
- printf(" Maximum block dimension:\t(%d,%d,%d)\n", iProp.maxThreadsDim[0], iProp.maxThreadsDim[1], iProp.maxThreadsDim[2]);
- }
我们了解以下几个重要且常用的属性:
1. name:表示 CUDA 设备的名称,是一个字符串。
2. multiProcessorCount:表示 GPU 设备上多处理器的数量。每个多处理器是一组能够执行并行操作的核心。
3. clockRate:表示 GPU 的核心时钟频率。
4. major/minor:表示 GPU 的主版本号和次版本号。这两者指示了 GPU 的计算能力。
5. totalGlobalMem:表示 GPU 全局内存的大小,单位是字节。全局内存是指 GPU 的主内存,所有的线程都可以访问,但访问速度比寄存器和共享内存慢。
6. totalConstMem:表示 GPU 常量内存的大小,单位是字节。常量内存是只读的,所以多个线程访问它时,会非常快。
7. sharedMemPerBlock:表示每个块上可用的共享内存大小,单位是字节。共享内存提供了比全局内存更快的访问速度,它在同一个块中的所有线程之间是共享的。
8. sharedMemPerMultiprocessor:表示每个处理器上可用的共享内存大小,单位是字节。它被同一个多处理器上的所有线程块共享。
9. regsPerBlock:表示每个块可用的寄存器总数。
10. warpSize:表示一个 warp 的大小,即 GPU 上并行执行的线程数。
11. maxThreadsPerBlock:表示每个块中可以包含的最大线程数。
12. maxThreadsPerMultiProcessor:表示每个处理器可以同时支持的最大线程数。
13. maxGridSize:表示每个网格各个维度上可以达到的最大尺寸。
14. maxThreadsDim:表示每个块在各个维度上可以包含的最大线程数。
我本机设备打印的内容如下:
- Device 0: NVIDIA GeForce RTX 2060 SUPER
- Number of multiprocessors: 34
- Clock rate: 1815000
- Compute capability: 7.5
- Total amount of global memory: 8388160.00 KB
- Total amount of constant memory: 64.00 KB
- Total amount of shared memory per block: 48.00 KB
- Total amount of shared memory per MP: 64.00 KB
- Total amount of registers available per block: 65536
- Warp size: 32
- Maximum number of threads per block: 1024
- Maximum number of threads per multiprocessor: 1024
- Maximum number of warps per multiprocessor: 32
- Maximum grid size: (2147483647,65535,65535)
- Maximum block dimension: (1024,1024,64)