1

我正在编写代码来定期使用 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 文档说,NVML_ERROR_INVALID_ARGUMENTnvmlDeviceID无效pmmodeNULL.

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

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

4

1 回答 1

0

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

如果出现无效参数错误,很可能问题出在nvmlDeviceID. 我说我能够查询设备属性,当时我确信它是正确的,但要注意nvmlDeviceID以后修改值的任何 API 调用。

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

nvmlDeviceGetHandleByIndex(some_variable, &nvmlDeviceID);

它必须改为:

nvmlDeviceGetHandleByIndex(0, &nvmlDeviceID);

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

于 2016-05-19T23:04:44.227 回答