2016-04-03 24 views
6

C#のパフォーマンスカウンタークラスを試してきましたが、CPUカウンターやWindowsパフォーマンスモニターのほとんどすべてを調べるのに成功しました。しかし、私は "NVIDIA GPU"カテゴリにアクセスできない...C#パフォーマンスカウンターヘルプ、Nvidia GPU

たとえば、次のコード行は通常動作する方法です。

PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

パフォーマンスコードに表示されるGPUカテゴリは、プロセッサカテゴリの場合と同様に、C#ではアクセスできません。次のコード行は、それにアクセスしようとします。

PerformanceCounter gpuCounter = new PerformanceCounter("NVIDIA GPU", "% GPU Usage","#0 Quadro K1100M(id=1, NVAPI ID=256)"); 

代わりに、それはスロー例外を「カテゴリーが存在しません」...ここで

は、パフォーマンスモニタ

enter image description here

内からカテゴリが明確に存在しているように見えるものですだから私の質問は...どうすればこのカウンターにアクセスできますか?

+0

私はすでにNVIDIAのPerfKitに見てきた、それがうまくいくかもしれないので、マニュアルには、非常に有用ではないが、十分な実行時の例があまりにも多くの情報がありませんと。 –

答えて

5

を検索するために、これを試してみてください、私は私の結果を共有する準備ができています。この欠落しているパフォーマンスカウンタを検索するために使用されたいくつかのテスト方法がありました。

1)最初は、キーワードの検索が非常に簡単でした。これには、PerformaceCounterCategoryだけでなく、私のシステム上で稼働するパフォーマンスカウンタのすべてのインスタンス(約12,000件)が含まれていました。この方法では、GPUやNVIDIAに関連するものは何も見つかりませんでしたが、CPUに対して完璧に機能しました。

2)次のテストは、GPUを特定の%使用率で実行して実行し、狭い範囲のパフォーマンスカウンタをすべて評価した検索が実行されました。この方法では、GPUに関連するものは何も返されませんでしたが、CPUのために完璧に動作しました。

これは結論につながります。 偽のエイリアスであっても、GPUのパフォーマンスカウンタは本当にありません。


ソリューション:

はどこにもそれがパフォーマンスモニタが明示的にパフォーマンスカウンタを使用しなければならないと述べていないんし、これに小さなヒントが顔にこの全体の時間を私たちを見つめていました。パフォーマンスモニタのインスタンス変数には、「NVAPI ID = 256」というラベルが付けられました。 NVIDIA APIは、NVIDIAハードウェアにパフォーマンス監視機能を提供するように設計されています。パフォーマンスカウンターと同様の操作を実行できますが、同じデータ型を使用してタスクを実行することはありません。パフォーマンスモニタがNVAPIを使用してパフォーマンスカウンタを使用する代わりに情報を収集しているという証拠があります。他のすべてのエントリがカウンタに対応するため、これは非常に誤解を招くものでした。したがって、がこれらの変数にアクセスする唯一の正しい方法は、NVAPIによるものであると結論付けることができます。

は、私が最初に私はいくつかのサンプルコードは、オープンハードウェアモニタのソースコードを使用しているブロガーからhereを見つけ使用NVIDIAのウェブサイトhere.

次からNVAPIをダウンロードすることにより、これを正常に行うことができた、と別のhereこのサイトに投稿してください。

コードはC++で書かれていますが、いくつかのライブラリを移動していくつかの.dllのすべてをC#にうまく移植した後にコードが作成されます。

ここに結果の写真があります。皆さん、お手伝いをしてくれてありがとう!

enter image description here

+0

アップデートを投稿してくれてありがとう、私は本当にこれについても頭を悩ませていた。 –

+0

問題ありません、ご協力いただきありがとうございます! –

2

Doing a PerformanceCounterCategory.GetCategories()を実行すると、システム上のすべてのカテゴリのリストが表示されます。正しいカテゴリを見つけると、PerformanceCounterCategory.GetCounters()はそのカテゴリのすべてのカウンタを一覧表示して正しい名前を取得します。

var cat = new PerformanceCounterCategory("Whatever the correct category name is"); 
var counters = cat.GetCounters(); 

更新:

これに6時間を過ごした後、それ

static void Main(string[] args) 
{ 
    var counters = PerformanceCounterCategory.GetCategories() 
     .SelectMany(x=>x.GetCounters("")).Where(x => x.CounterName.Contains("GPU")); 

    foreach (var counter in counters) 
    { 
     Console.WriteLine("{0} - {1}", counter.CategoryName, counter.CounterName); 
    } 
    Console.ReadLine(); 
} 
+1

私は自分のパフォーマンスカウンターをチェックしましたが、私のマシンにそのカテゴリはありませんでした。そうでなければ実際の名前も含まれていました –

+1

同様に、上記のようにカテゴリは存在しません。 PerformanceCounterCategory.GetCategories()は、GPUまたはNVIDIA関連のものを返しません。だから問題はまだ残っていますが、PerfMonで見つかったが公開されていないこのカテゴリにはどうすればアクセスできますか? –

+0

これはちょうど意味がない、プライベートカウンターを行う方法はない、それはそこにあるはずだが、期待していない名前でなければならない。恐らく、ある種の暗黙の略語?私はもっ​​と助けてもらいたいと思っていますが、私が言ったように、あなたがそうしたように、Add Countersメニューに「NVIDIA GPU」はありませんでした。 –

関連する問題