我正在编写一个代码来定期使用NVML来测量NVIDIA K20 GPU (开普勒架构)的功率使用情况。
变量
nvmlReturn_t result;
nvmlEnableState_t pmmode;
nvmlDevice_t nvmlDeviceID;
unsigned int powerInt;Basic代码
result = nvmlDeviceGetPowerManagementMode(nvmlDeviceID, &pmmode);
if (pmmode == NVML_FEATURE_ENABLED) {
result = nvmlDeviceGetPowerUsage(nvmlDeviceID, &powerInt);
}我的问题是nvmlDeviceGetPowerManagementMode总是返回NVML_ERROR_INVALID_ARGUMENT。我查过这个了。
NVML文档指出,当NVML_ERROR_INVALID_ARGUMENT无效或pmmode为NULL时,将返回pmmode。
nvmlDeviceID绝对是有效的,因为我能够查询它的属性,这些属性与我的GPU匹配。但是我不明白为什么我应该将pmmode的值设置为任何东西,因为文档中说它是一个Reference in which to return the current power management mode。为了记录在案,我尝试给它分配一个启用值,但是结果仍然是一样的。
我显然做错了什么,因为系统的其他用户已经使用这个函数编写了自己的库,而且他们没有遇到任何问题。我无法联系他们。要使这个函数正确工作,我应该修复什么?
发布于 2016-05-19 23:04:44
这里的问题不是直接在API调用中--而是在其余的代码中--但是答案可能对其他人有用。在尝试此解决方案之前,必须知道启用了电源管理模式(请与nvidia-smi -q -d POWER检查)。
在参数错误无效的情况下,问题很可能是nvmlDeviceID造成的。我说过我能够查询设备属性,当时我确信它是正确的,但是要注意稍后修改nvmlDeviceID值的任何API调用。
例如,在本例中,下面的API调用将some_variable作为无效索引,因此nvmlDeviceID变得无效。
nvmlDeviceGetHandleByIndex(some_variable, &nvmlDeviceID);它必须改为:
nvmlDeviceGetHandleByIndex(0, &nvmlDeviceID);因此,解决方案要么删除所有更改或使nvmlDeviceID值无效的API调用,要么至少确保代码中的任何现有API调用都不会修改该值。
https://stackoverflow.com/questions/37309449
复制相似问题