2016-04-03 146 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。

我能够首先从NVIDIA网站here.

下一页下载NVAPI我用一些示例代码中发现here从使用开放硬件监控源代码的博客成功地做到这一点,并从另一个here张贴在这个网站上。

该代码是用C++编写的,但是在移动了一些库并制作了一些.dll的所有内容后,它们都很好地转换为C#。

以下是结果图片。感谢大家的帮助和支持!

enter image description here

+0

感谢您发布更新信息,我也非常在意这一点。 –

+0

没问题,谢谢你的帮助! –

2

做一个PerformanceCounterCategory.GetCategories()会给你一个你系统上所有类别的列表,一旦你找到了正确的类别,你可以使用PerformanceCounterCategory.GetCounters()将列出该类别中的所有计数器,以便你可以得到正确的名称。

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

更新:

试试这个搜索它

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

这只是没有意义,没有办法做一个私人柜台,它必须在那里,但根据你不期望的名字。也许某种神秘的缩写?我真的希望我能够帮助更多,但正如我所说的,我的“添加计数器”菜单中没有“NVIDIA GPU”,就像您所做的那样,我的确有点盲目。 –