关于nvmlDeviceGetProcessUtilization返回的SmUtil等技术问题
NVML
nvmlDeviceGetProcessUtilization API 常见疑问解答 我在编写监控进程GPU使用情况的程序时,用到了NVML提供的nvmlDeviceGetProcessUtilization API。根据API注释,它会读取当前运行进程的GPU SM(3D/计算)、帧缓冲区、视频编码器及解码器的近期使用率。我分别以1秒和10秒间隔调用该API,得到以下采样结果(ReadTime为API调用时间,sample为返回采样数据):
ReadTime:10:58:56.194 - sample:[Pid:28128, Timestamp:10:58:55.462519, SmUtil:05, MemUtil:01, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:28104, Timestamp:10:58:55.127657, SmUtil:05, MemUtil:02, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:28084, Timestamp:10:58:48.051124, SmUtil:03, MemUtil:01, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:28050, Timestamp:10:58:53.944518, SmUtil:03, MemUtil:01, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:27989, Timestamp:10:58:47.043732, SmUtil:03, MemUtil:01, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:27976, Timestamp:10:58:53.604955, SmUtil:09, MemUtil:03, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:27814, Timestamp:10:58:48.386200, SmUtil:19, MemUtil:07, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:27900, Timestamp:10:58:56.132879, SmUtil:17, MemUtil:06, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:27960, Timestamp:10:58:51.423172, SmUtil:06, MemUtil:02, EncUtil:00, DecUtil:00] ReadTime:10:58:56.194 - sample:[Pid:27832, Timestamp:10:58:47.883811, SmUtil:21, MemUtil:08, EncUtil:00, DecUtil:00] SUM - GPUId:0, process:10, smSum:91, memSum:32, encSum:0, decSum:0
疑问与解答
1. 为何无论以1秒还是10秒间隔调用该API,返回样本中每个进程仅对应一条数据?
nvmlDeviceGetProcessUtilization的设计逻辑是,每次调用时返回当前每个活跃进程的最新一次采样数据,而非该进程在调用间隔内的所有采样记录。NVML内部会持续对进程GPU使用情况采样,但对外暴露时,每个进程仅保留最近的有效采样结果,因此不管调用间隔是1秒还是10秒,每个进程只会返回一条代表其近期状态的数据。
2. 各样本时间戳看似无规律,NVML如何确定采样时间?
NVML的进程级采样并非固定间隔触发,而是基于GPU内部的事件驱动或动态采样机制:
- 当进程发起GPU相关操作(如启动计算内核、访问显存)时,采样器会记录状态并更新时间戳;
- 对于长期无GPU活动的进程,采样时间会停留在其最后一次GPU操作的时间点;
- 后台维护的采样线程会定期对活跃进程轮询,但间隔不固定,因此不同进程的采样时间戳会呈现出看似无规律的分布。
3. SmUtil如何计算?如何理解该API返回的进程级SmUtil?
进程级的SmUtil与设备级nvmlDeviceGetUtilizationRates的计算逻辑本质一致,但维度从整个GPU缩小到单个进程:
- 设备级SmUtil是整个GPU在采样周期内有SM核心被占用的时间占比;
- 进程级SmUtil则是该进程在自身采样周期内,占用SM核心的时间占比。具体来说,NVML会统计该进程调度到SM核心上执行的时间,除以采样周期总时长得到百分比数值。这个数值反映的是该进程自身对SM资源的使用强度,而非其占用整个GPU的比例(因此多个进程的SmUtil之和可能超过100%)。
内容的提问来源于stack exchange,提问作者nezhababa
相关产品推荐
相关产品推荐

