C# 性能计数器帮助,Nvidia GPU
C# Performance Counter Help, Nvidia GPU
所以我一直在 C# 中试验性能计数器 class,并且在探测 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)");
而是抛出 "Category does not exist" 异常...
这是性能监视器中的样子
该类别显然存在,所以我的问题是...我如何访问该计数器?
执行 PerformanceCounterCategory.GetCategories()
will get you a list of all categories on your system, once you find the correct catagory you can use 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) 首先是非常简单的关键字搜索。这包括 PerformaceCounterCategory 以及我系统上的每个性能计数器实例 运行(大约 12,000 个)。此方法没有找到任何与 GPU 或 NVIDIA 相关的内容,但对于 CPU.
2) 下一个测试由 运行 GPU 在非常具体的使用百分比下执行,并执行搜索以评估每个百分比性能计数器 运行 在一个狭窄的值范围内。此方法也没有 return 任何与 GPU 相关的内容,但再次完美地适用于 CPU.
由此得出一个结论。 GPU 确实没有性能计数器,甚至在假别名下也没有。
解决方案:
它没有在任何地方声明性能监视器必须明确使用性能计数器,对此的一个小 提示 一直盯着我们看。性能监视器中的实例变量被标记为 "NVAPI ID=256"。 NVIDIA API 旨在为 NVIDIA 硬件提供性能监控功能。尽管它可以执行类似于性能计数器的操作,但它不使用相同的数据类型来执行其任务。我们现在有证据表明性能监视器使用 NVAPI 来收集信息,而不是使用性能计数器。这是非常误导的,因为每个其他条目都对应一个计数器。所以我们可以得出结论,访问这些变量的唯一正确方法是通过 NVAPI.
我通过首先从 NVIDIA 网站 here.
下载 NVAPI 成功地做到了这一点
接下来,我使用了从本网站上的另一个 post 找到的一些示例代码 here from a blogger that is using Open Hardware Monitor source code, and here。
代码是用 C++ 编写的,但在移动了一些库并制作了一些 .dll 后,所有内容都很好地移植到 C#。
这是结果的图片。感谢大家的帮助和支持!
所以我一直在 C# 中试验性能计数器 class,并且在探测 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)");
而是抛出 "Category does not exist" 异常...
这是性能监视器中的样子
该类别显然存在,所以我的问题是...我如何访问该计数器?
执行 PerformanceCounterCategory.GetCategories()
will get you a list of all categories on your system, once you find the correct catagory you can use 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) 首先是非常简单的关键字搜索。这包括 PerformaceCounterCategory 以及我系统上的每个性能计数器实例 运行(大约 12,000 个)。此方法没有找到任何与 GPU 或 NVIDIA 相关的内容,但对于 CPU.
2) 下一个测试由 运行 GPU 在非常具体的使用百分比下执行,并执行搜索以评估每个百分比性能计数器 运行 在一个狭窄的值范围内。此方法也没有 return 任何与 GPU 相关的内容,但再次完美地适用于 CPU.
由此得出一个结论。 GPU 确实没有性能计数器,甚至在假别名下也没有。
解决方案:
它没有在任何地方声明性能监视器必须明确使用性能计数器,对此的一个小 提示 一直盯着我们看。性能监视器中的实例变量被标记为 "NVAPI ID=256"。 NVIDIA API 旨在为 NVIDIA 硬件提供性能监控功能。尽管它可以执行类似于性能计数器的操作,但它不使用相同的数据类型来执行其任务。我们现在有证据表明性能监视器使用 NVAPI 来收集信息,而不是使用性能计数器。这是非常误导的,因为每个其他条目都对应一个计数器。所以我们可以得出结论,访问这些变量的唯一正确方法是通过 NVAPI.
我通过首先从 NVIDIA 网站 here.
下载 NVAPI 成功地做到了这一点接下来,我使用了从本网站上的另一个 post 找到的一些示例代码 here from a blogger that is using Open Hardware Monitor source code, and here。
代码是用 C++ 编写的,但在移动了一些库并制作了一些 .dll 后,所有内容都很好地移植到 C#。
这是结果的图片。感谢大家的帮助和支持!