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# 性能计数器?

无法使用 c# 获取特定于 SSAS 的性能计数器类别

C# 不提供 Windows 性能计数器(在 Azure 辅助角色上)

在 c# 中从 W3wp 获取性能计数器

是否有任何 C# 框架或代码来解析 *blg 性能计数器日志文件?

C# WMI、性能计数器和 SNMP 哦,天哪!