2016-05-18 6 views
1

私は、NVIDIA Tesla K20 GPU(Keplerアーキテクチャ)の電力使用量をNVML APIを使って定期的に測定するコードを書いています。nvmlDeviceGetPowerManagementMode()は常にNVML_ERROR_INVALID_ARGUMENTを返しますか?

変数

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を返しているということです。私はこれをチェックした。

nvmlDeviceIDが無効か、pmmodeNULLの場合、NVML APIドキュメントではNVML_ERROR_INVALID_ARGUMENTが返されます。

nvmlDeviceIDは、自分のGPUに一致するプロパティを照会できるため、間違いなく有効です。しかし、Reference in which to return the current power management modeと書かれているので、なぜ私はpmmodeの値を何に設定すべきかわかりません。レコードについては、有効値を割り当てようとしましたが、結果は同じです。

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

答えて

0

ここでの問題は、APIコールでは直接的なものではなく、コードの残りの部分にありましたが、その答えは他の人にとっては有用かもしれません。このソリューションを試す前に、電源管理モードが有効になっていることを確認する必要があります(nvidia-smi -q -d POWERで確認してください)。

無効な引数エラーの場合は、問題がnvmlDeviceIDにある可能性があります。私はデバイスのプロパティを問い合わせることができ、当時は正しいと確信していましたが、後でnvmlDeviceIDの値を変更するAPI呼び出しを認識していました。

たとえば、この場合、無効なインデックスとしてsome_variableがあるため、nvmlDeviceIDが無効になりました。

nvmlDeviceGetHandleByIndex(some_variable, &nvmlDeviceID); 

はそれに変更する必要がありました:

nvmlDeviceGetHandleByIndex(0, &nvmlDeviceID); 

だから、解決策は、変更のすべてのAPI呼び出しを削除するかnvmlDeviceIDの値を無効にする、または少なくとも確実にするためにするかのいずれかであること、既存のAPI呼び出しコード内の値は変更されません。

関連する問題