如何通过C# WPF获取神经处理单元(NPU)的性能等信息
获取NPU信息的C# WPF实现方案
方法1:使用Windows Runtime API(Windows.AI.MachineLearning)
Windows 10及以上系统提供了专门的AI设备枚举API,可直接获取包括NPU在内的机器学习硬件信息,部分设备还能返回性能指标(如TOPS)。
示例代码:
using Windows.AI.MachineLearning; using System.Linq; // 异步枚举所有可用机器学习设备 var devices = await LearningModelDevice.GetAvailableAsync(); foreach (var device in devices) { // 通过设备名称判断是否为NPU if (device.Name.Contains("NPU") || device.Name.Contains("Neural")) { Console.WriteLine($"设备名称: {device.Name}"); Console.WriteLine($"设备ID: {device.Id}"); Console.WriteLine($"设备类型: {device.DeviceKind}"); // 尝试获取TOPS性能参数(部分设备支持) if (device.Properties.TryGetValue("Microsoft.AI.MachineLearning.DevicePerformanceTops", out var topsValue)) { Console.WriteLine($"运算能力(TOPS): {topsValue}"); } } }
注意:项目需添加对Windows.winmd的引用,目标框架设置为.NET 6+或.NET Core 3.0+(支持WinRT互操作),WPF项目可直接适配。
方法2:读取系统注册表信息
主流硬件厂商(Intel、AMD等)会将NPU信息写入系统注册表,可通过读取对应路径获取基础信息:
示例代码:
using Microsoft.Win32; // 读取Intel NPU相关注册表项 var intelKey = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0"); if (intelKey != null) { var processorName = intelKey.GetValue("ProcessorNameString")?.ToString(); if (!string.IsNullOrEmpty(processorName) && processorName.Contains("NPU")) { Console.WriteLine($"Intel NPU信息: {processorName}"); // 部分型号可通过厂商文档查询额外注册表项获取TOPS数据 } } // 读取AMD NPU相关注册表项 var amdKey = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0"); if (amdKey != null) { var brandId = amdKey.GetValue("BrandId")?.ToString(); // 根据BrandId匹配带NPU的型号,再查询对应性能参数 }
注意:注册表路径因厂商和硬件型号存在差异,需针对不同品牌做适配。
方法3:调用厂商官方SDK
若需精准获取官方标定的TOPS等参数,可直接使用硬件厂商提供的专属SDK:
- Intel:Intel Distribution of OpenVINO Toolkit,提供NPU性能、状态查询API
- AMD:AMD ROCm SDK,支持AI加速器参数查询
- Qualcomm:Qualcomm AI Engine Direct SDK,适配移动端及PC端NPU设备
这些SDK大多提供C#绑定,或可通过P/Invoke调用原生接口。
替代方案:解析系统工具输出
如果以上方法无法满足需求,可调用系统自带工具(如msinfo32.exe)生成系统信息文件,再解析其中的NPU相关内容:
using System.Diagnostics; var process = new Process(); process.StartInfo.FileName = "msinfo32.exe"; process.StartInfo.Arguments = "/nfo C:\\temp\\systeminfo.nfo"; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForExit(); // 读取生成的nfo文件,查找NPU相关条目并解析
内容的提问来源于stack exchange,提问作者Pason
相关产品推荐
相关产品推荐

