我想检测实际物理核心的数量,而不是逻辑核心的数量,当更多线程竞争私有每核心缓存时负扩展的工作负载,和/或具有足够高的 IPC,每个核心运行一个以上的逻辑线程不会通过增加线程开销来增加吞吐量,特别是对于不能完美扩展到大量内核的问题。
或者换句话说,可以运行的线程数,除了内存带宽之外,它们中的任何一个都不会相互竞争执行资源。(编者注:超线程的一些替代方案,例如 AMD Bulldozer 系列 CMP有 2 个整数内核共享一个 FPU/SIMD 单元;您可能希望根据工作负载将其计为 2 个真实内核,即使您不想计算2 个逻辑内核与SMT(例如 Intel 的超线程)共享一个物理内核。)
我知道以前有人问过类似的问题,但答案看起来已经过时了。或者获取物理处理器数量 .NET Core 2.2没有答案,问题中的代码不是完全可移植的。
System.Environment.ProcessorCount仅返回逻辑核心数,因此是我的超线程系统中的两倍。对于一些密集的并行计算,启动线程数不超过可用物理内核数是最有效的- 至少我的测试表明,当我启动更多线程时,性能会显着下降。
我发现一些 Windows 解决方案调用 WMI 或 kernel.dll 来获取物理内核的数量。但是如何在 .net core 上保持平台独立性?是否有隐藏的核心数或可靠的计算方法?
到目前为止,我发现的最有前途的想法是在一个线程上做一些更长的计算并测量它的时间。然后并行执行相同的计算(ae ProcessorCount 线程)并测量总时间。比较两次以猜测物理内核的数量。这可能有效,但对我来说看起来成本高昂且不可靠。