System.Environment.ProcessorCount显示N个处理器(在我的情况下为N = 8),我想要使用它。现在问题是,Windows资源管理器sais,我的4个CPU被“停放”,而8个线程我开始只分离到4个未阻塞的CPU。
现在还有办法使用停放的CPU吗?
答案 0 :(得分:7)
当Windows“停放”CPU核心时,这意味着该核心没有足够的工作可以将核心置于低功耗状态。为了“取消停放”CPU,你只需要创造足够的工作。
如果您正在启动8个线程并且Windows没有取消停放CPU,则线程可能正在进行I / O,阻塞或完成太快。如果你发布你的主题正在做什么,也许有人可以解释为什么他们没有在停放的核心上运行。
答案 1 :(得分:3)
通常,你应该能够这样做:
Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)0x00FF;
请在此处查看相关文档:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity.aspx
但它也表示,默认情况下,您的流程会分配给所有核心。
另一方面,您可以尝试ProcessThread.ProcessorAffinity并尝试手动设置它(如果您想强制每个线程使用另一个核心)。
答案 2 :(得分:2)
Win7 / 2K8R2在其他核心饱和或接近饱和之前不会取消核心。
停车核心的重点是巩固工作。使用80个核心的4个核心比使用40个核心的8个核心更节能。此外,性能差异应该几乎不存在。
此外,根据共享的数据量,合并工作实际上会更快,因为同步开销较少,因为涉及的硬件线程较少。来自一个线程的最新数据更改将更有可能在缓存中。
因此,常见的最坏情况是相同的性能和较少的功耗,常见的最佳情况是性能更好,功耗更低。
答案 3 :(得分:0)
停靠不受进程的CPU关联性设置控制,它由Windows CPU Scheduler自动完成。调整CPU亲和力可能会强制使用某些内核,但Windows只会停放不同的内核。根据系统负载,可以非常快速地动态打开或关闭停车。实际上,它默认具有惊人的攻击性(在某些平台上可能太多了)。您可以在资源监视器中看到它,如您所见。
您应该使用极其谨慎来设置自己的CPU亲和力。您必须考虑HyperThreaded核心,或者在AMD Bulldozer的情况下,共享核心共享计算单元(他们的HyperThreading没有超线程; p)。你不想最终“陷入困境”。在超线程核心上,它只提供真实核心性能的一小部分。 CPU调度程序知道这些事情,所以通常最好留下亲和力 - 除非你知道你正在做什么,并检查了系统的CPU。
但是,您可以非常轻松地启用/禁用或调整CPU停放,无需重启。我写了一个HOW-TO,有一个简单的GUI,在这里:How to Enable/Disable or Tweak CPU Parking Without a Reboot, and without Registry Edits
它还包含有关CPU停放的更多信息,以及如何使用PowerCfg.exe进行调整。实际上,您可以在Windows中的标准高级电源配置文件设置中显示该选项,但需要进行一些调整,我不会进入此处。