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
无效或 pmmode
为 NULL
时返回 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 调用确实不修改值。
我正在编写代码,使用 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
无效或 pmmode
为 NULL
时返回 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 调用确实不修改值。