《CUDA C编程权威指南》——2.4 设备管理

本节书摘来自华章计算机《CUDA C编程权威指南》一书中的第2章,第2.4节,作者 [美] 马克斯·格罗斯曼(Max Grossman),译 颜成钢 殷建 李亮,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 设备管理

NVIDIA提供了几个查询和管理GPU设备的方法。学会如何查询GPU设备信息是很重要的,因为在运行时你可以使用它来帮助设置内核执行配置。

在本节,你将通过以下两种方法学习查询和管理GPU设备:

  • CUDA运行时API函数
  • NVIDIA系统管理界面(nvidia-smi)命令行实用程序

2.4.1 使用运行时API查询GPU信息

在CUDA运行时API中有很多函数可以帮助管理这些设备。可以使用以下函数查询关于GPU设备的所有信息:
《CUDA C编程权威指南》——2.4 设备管理

cudaDeviceProp结构体返回GPU设备的属性,可以通过以下网址查看其内容:
《CUDA C编程权威指南》——2.4 设备管理

代码清单2-8提供了一个示例,查询了大家通常感兴趣的一般属性。可以使用下列命令编译并运行:
《CUDA C编程权威指南》——2.4 设备管理

根据你的配置,checkDeviceInfor将返回所安装设备的不同信息。下面是一个输出示例:
《CUDA C编程权威指南》——2.4 设备管理

《CUDA C编程权威指南》——2.4 设备管理
《CUDA C编程权威指南》——2.4 设备管理
《CUDA C编程权威指南》——2.4 设备管理

2.4.2 确定最优GPU

一些系统支持多GPU。在每个GPU都不同的情况下,选择性能最好的GPU运行核函数是非常重要的。通过比较GPU包含的多处理器的数量选出计算能力最佳的GPU。如果你有一个多GPU系统,可以使用以下代码来选择计算能力最优的设备:
《CUDA C编程权威指南》——2.4 设备管理

2.4.3 使用nvidia-smi查询GPU信息

nvidia-smi是一个命令行工具,用于管理和监控GPU设备,并允许查询和修改设备状态。

你可以从命令行调用nvidia-smi。例如,要确定系统中安装了多少个GPU以及每个GPU的设备ID,可以使用以下命令:
《CUDA C编程权威指南》——2.4 设备管理

你可以使用以下命令获取GPU 0的详细信息:
《CUDA C编程权威指南》——2.4 设备管理

可以利用下列参数精简nvidia-smi的显示信息:

  • MEMORY
  • UTILIZATION
  • ECC
  • TEMPERATURE
  • POWER
  • CLOCK
  • COMPUTE
  • PIDS
  • PERFORMANCE
  • SUPPORTED_CLOCKS
  • PAGE_RETIREMENT
  • ACCOUNTING

例如,若只显示设备内存信息,可使用以下命令:
《CUDA C编程权威指南》——2.4 设备管理

若只显示设备使用信息,可使用以下命令:
《CUDA C编程权威指南》——2.4 设备管理

2.4.4 在运行时设置设备

支持多GPU的系统是很常见的。对于一个有N个GPU的系统,nvidia-smi从0到N―1标记设备ID。使用环境变量CUDA_VISIBLE_DEVICES,就可以在运行时指定所选的GPU且无须更改应用程序。

设置运行时环境变量CUDA_VISIBLE_DEVICES=2。nvidia驱动程序会屏蔽其他GPU,这时设备2作为设备0出现在应用程序中。

也可以使用CUDA_VISIBLE_DEVICES指定多个设备。例如,如果想测试GPU 2和GPU 3,可以设置CUDA_VISIBLE_DEVICES = 2, 3。然后,在运行时,nvidia驱动程序将只使用ID为2和3的设备,并且会将设备ID分别映射为0和1。