C#线程停放CPU?

时间:2011-02-07 13:39:10

标签: c# multithreading cpu

System.Environment.ProcessorCount显示N个处理器(在我的情况下为N = 8),我想要使用它。现在问题是,Windows资源管理器sais,我的4个CPU被“停放”,而8个线程我开始只分离到4个未阻塞的CPU。

现在还有办法使用停放的CPU吗?

4 个答案:

答案 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中的标准高级电源配置文件设置中显示该选项,但需要进行一些调整,我不会进入此处。