设备属性

在 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);
代码清单 1 设备属性
  1. void query_device()
  2. {
  3.     int deviceCount = 0;
  4.     cudaGetDeviceCount(&deviceCount);
  5.  
  6.     if (deviceCount == 0)
  7.     {
  8.         fprintf(stderr, "No CUDA support device found\n");
  9.         return;
  10.     }
  11.  
  12.     int devNo = 0;
  13.     cudaDeviceProp iProp;
  14.     cudaGetDeviceProperties(&iProp, devNo);
  15.  
  16.     printf("Device %d: %s\n", devNo, iProp.name);
  17.     printf("    Number of multiprocessors:\t%d\n", iProp.multiProcessorCount);
  18.     printf("    Clock rate:\t%d\n", iProp.clockRate);
  19.     printf("    Compute capability:\t%d.%d\n", iProp.major, iProp.minor);
  20.     printf("    Total amount of global memory:\t%4.2f KB\n", iProp.totalGlobalMem / 1024.0);
  21.     printf("    Total amount of constant memory:\t%4.2f KB\n", iProp.totalConstMem / 1024.0);
  22.     printf("    Total amount of shared memory per block:\t%4.2f KB\n", iProp.sharedMemPerBlock / 1024.0);
  23.     printf("    Total amount of shared memory per MP:\t%4.2f KB\n", iProp.sharedMemPerMultiprocessor / 1024.0);
  24.     printf("    Total amount of registers available per block:\t%d\n", iProp.regsPerBlock);
  25.     printf("    Warp size:\t%d\n", iProp.warpSize);
  26.     printf("    Maximum number of threads per block:\t%d\n", iProp.maxThreadsPerBlock);
  27.     printf("    Maximum number of threads per multiprocessor:\t%d\n", iProp.maxThreadsPerMultiProcessor);
  28.     printf("    Maximum number of warps per multiprocessor:\t%d\n", iProp.maxThreadsPerMultiProcessor / 32);
  29.     printf("    Maximum grid size:\t(%d,%d,%d)\n", iProp.maxGridSize[0], iProp.maxGridSize[1], iProp.maxGridSize[2]);
  30.     printf("    Maximum block dimension:\t(%d,%d,%d)\n", iProp.maxThreadsDim[0], iProp.maxThreadsDim[1], iProp.maxThreadsDim[2]);
  31. }

我们了解以下几个重要且常用的属性:

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)