我想检测实际物理核心的数量,而不是逻辑核心的数量,因为当更多线程竞争私有每核心缓存时,工作负载会出现负扩展,和/或具有足够高的 IPC,每个核心运行多个逻辑线程不会吞吐量的增加超过线程开销的增加,特别是对于无法完美扩展到大量内核的问题。
或者换句话说,在没有任何线程相互竞争执行资源(内存带宽除外)的情况下可以运行的线程数量。 (编者注:超线程的一些替代方案,例如 AMD推土机系列 CMP https://en.wikipedia.org/wiki/Bulldozer_(microarchitecture)#Bulldozer_core有 2 个整数核心共享一个 FPU/SIMD 单元;您可能希望根据工作负载将其算作 2 个真正的核心,即使您不想算作 2 个与物理核心共享的逻辑核心SMT https://en.wikipedia.org/wiki/Simultaneous_multithreading例如英特尔的超线程。)
我知道以前曾有人问过类似的问题,但答案看起来已经过时了。或者获取物理处理器数量 .NET Core 2.2 https://stackoverflow.com/questions/56139338/getting-physical-processor-count-net-core-2-2没有答案,问题中的代码不完全可移植。
System.Environment.ProcessorCount
返回的计数logical仅限核心,因此我的超线程系统的数量是双倍的。对于某些密集的并行计算,启动的线程数不超过physical可用核心 - 至少我的测试表明,当我启动更多线程时,性能会显着下降。
我发现一些仅适用于 Windows 的解决方案调用 WMI 或 kernel.dll 来获取物理核心的数量。但是如何在.net core 上保持平台独立性?是否有隐藏的核心数量或可靠的计算方法?
到目前为止,我发现的最有前途的想法是在一个线程上进行一些较长的计算并测量它的时间。然后并行执行相同的计算(即 ProcessorCount 线程)并测量总时间。比较两次来猜测物理核心的数量。这可能有效,但对我来说看起来成本高昂且不可靠。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)