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_ARGUMENT場合に が返されると記載されています。nvmlDeviceIDpmmodeNULL

nvmlDeviceIDGPUと一致するプロパティを照会できるため、間違いなく有効です。しかしpmmode、ドキュメンテーションにはReference in which to return the current power management mode. 念のため、enable 値を割り当ててみましたが、結果は同じでした。

システムの他のユーザーがこの関数を使用して独自のライブラリを作成しており、問題に直面していないため、私は明らかに何か間違っています。私は彼らに連絡することができません。この機能を正しく動作させるには、何を修正すればよいですか?

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 に答える