C# 性能计数器帮助,Nvidia GPU
Posted
技术标签:
【中文标题】C# 性能计数器帮助,Nvidia GPU【英文标题】:C# Performance Counter Help, Nvidia GPU 【发布时间】:2016-07-23 05:52:02 【问题描述】:因此,我一直在尝试使用 C# 中的性能计数器类,并且在探测 CPU 计数器以及我在 Windows 性能监视器中可以找到的几乎所有内容方面取得了巨大成功。但是,我无法访问“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)");
相反,它会引发“类别不存在”异常...
这是从性能监视器中看到的样子
类别明显存在,所以我的问题是……我如何访问这个计数器?
【问题讨论】:
我已经查看了 Nvidia PerfKit,文档不是很有帮助,所以它可能有效,但是那里的信息太多,运行时示例不足。 不确定这是否重要,但我注意到您提供的类别名称与屏幕截图中显示的字符串不匹配。您的代码在 K1100M 和左括号之间没有空格。同样,可能无关紧要,但我注意到了。 【参考方案1】:花了六个小时后,我准备分享我的结果。有多种测试方法可用于搜索此缺失的性能计数器。
1) 第一个是非常简单的关键字搜索。这包括 PerformaceCounterCategory 以及在我的系统上运行的每个性能计数器实例(大约 12,000 个)。这种方法没有找到任何与 GPU 或 NVIDIA 相关的东西,但对于 CPU 来说却完美无缺。
2) 下一个测试是通过以非常特定的百分比使用率运行 GPU 来执行的,并执行了一项搜索,以评估在一个狭窄的值范围内运行的每个百分比性能计数器。此方法也没有返回任何与 GPU 相关的内容,但同样适用于 CPU。
这导致了一个结论。 GPU 确实没有性能计数器,即使是假别名也没有。
解决方案:
它没有说明性能监视器必须明确使用性能计数器,而一个小的提示一直在盯着我们。性能监视器中的实例变量被标记为“NVAPI ID=256”。 NVIDIA API 旨在允许对 NVIDIA 硬件进行性能监控。尽管它可以执行类似于性能计数器的操作,但它不使用相同的数据类型来执行其任务。我们现在有证据表明性能监视器正在使用 NVAPI 来收集信息,而不是使用性能计数器。这是非常具有误导性的,因为每个其他条目都对应一个计数器。因此我们可以得出结论,访问这些变量的唯一正确方法是通过 NVAPI。
我首先从 NVIDIA 网站 here. 下载了 NVAPI,从而成功地做到了这一点
接下来,我使用了从使用 Open Hardware Monitor 源代码的博主那里找到的一些示例代码 here,以及从本网站的另一篇文章中找到的 here。
代码是用 C++ 编写的,但是在移动了一些库并制作了一些 .dll 之后,一切都很好地移植到了 C#。
这是结果的图片。感谢大家的帮助和支持!
【讨论】:
感谢您发布更新,我也真的为此摸不着头脑。【参考方案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();
【讨论】:
我检查了我的性能计数器,我的机器上没有那个类别,否则我也会包括实际名称是什么 同样,如上所述,该类别不存在。 PerformanceCounterCategory.GetCategories() 不返回任何与 GPU 或 NVIDIA 相关的内容。所以问题仍然存在,我如何访问在 PerfMon 中找到但不公开可见的这个类别。 这没有意义,没有办法做一个私人柜台,它必须在那里,但在一个你意想不到的名字下。也许某种神秘的缩写?我真的希望我能提供更多帮助,但正如我所说,我的“添加计数器”菜单中没有像你那样的“NVIDIA GPU”,所以我有点盲目。 @AlexE 在我的更新中尝试搜索代码,你有什么有用的吗? @AlexE 您可以尝试另一件事,从命令行执行typeperf -q -o "C:\Temp\counters.txt"
然后在 txt 文件中生成对 GPU
的搜索。以上是关于C# 性能计数器帮助,Nvidia GPU的主要内容,如果未能解决你的问题,请参考以下文章
C# 不提供 Windows 性能计数器(在 Azure 辅助角色上)