nvmlDeviceGetPowerManagementMode() 总是返回 NVML_ERROR_INVALID_ARGUMENT?

nvmlDeviceGetPowerManagementMode() always returning NVML_ERROR_INVALID_ARGUMENT?

我正在编写代码,使用 NVML API.

定期测量 NVIDIA Tesla K20 GPU(Kepler 架构)的功耗

变量:

nvmlReturn_t result;
nvmlEnableState_t pmmode;
nvmlDevice_t nvmlDeviceID;
unsigned int powerInt;

基本代码:

result = nvmlDeviceGetPowerManagementMode(nvmlDeviceID, &pmmode);
if (pmmode == NVML_FEATURE_ENABLED) {
    result = nvmlDeviceGetPowerUsage(nvmlDeviceID, &powerInt);
}

我的问题是 nvmlDeviceGetPowerManagementMode 总是返回 NVML_ERROR_INVALID_ARGUMENT。我检查了这个。

NVML API 文档说当 nvmlDeviceID 无效或 pmmodeNULL 时返回 NVML_ERROR_INVALID_ARGUMENT

nvmlDeviceID 绝对有效,因为我可以查询与我的 GPU 匹配的属性。但我不明白为什么我应该将 pmmode 的值设置为任何值,因为文档说它是 Reference in which to return the current power management mode。作为记录,我尝试为其分配一个启用值,但结果仍然相同。

我显然做错了什么,因为系统的其他用户已经使用此功能编写了自己的库,并且他们没有遇到任何问题。我无法联系他们。我应该修复什么才能使此功能正常工作?

这里的问题不直接出在 API 调用中 - 它出在代码的其余部分 - 但答案可能对其他人有用。在尝试此解决方案之前,必须知道电源管理模式已启用这一事实(检查 nvidia-smi -q -d POWER)。

如果出现invalid argument错误,很可能是nvmlDeviceID出了问题。我说过我能够查询设备属性,当时我确定它是正确的,但请注意稍后修改 nvmlDeviceID 值的任何 API 调用。

例如,在这种情况下,以下 API 调用将 some_variable 作为无效索引,因此 nvmlDeviceID 变为无效。

nvmlDeviceGetHandleByIndex(some_variable, &nvmlDeviceID);

必须改为:

nvmlDeviceGetHandleByIndex(0, &nvmlDeviceID);

因此解决方案是删除所有 API 调用更改或使 nvmlDeviceID 的值无效,或者至少确保代码中任何现有的 API 调用确实不修改值。