System.Environment.ProcessorCount顯示了N個處理器(N,在我的情況下= 8),我想使用它。現在的問題是,windows資源管理員sais,我的4個CPU被「停放」,並且我開始的8個線程只是分開到4個未阻塞的CPU。C#線程停放CPU?
現在有沒有辦法使用停放的CPU呢?
System.Environment.ProcessorCount顯示了N個處理器(N,在我的情況下= 8),我想使用它。現在的問題是,windows資源管理員sais,我的4個CPU被「停放」,並且我開始的8個線程只是分開到4個未阻塞的CPU。C#線程停放CPU?
現在有沒有辦法使用停放的CPU呢?
通常情況下,你應該能夠做到這一點是這樣的:
Process.GetCurrentProcess().ProcessorAffinity = (IntPtr)0x00FF;
看到文檔在這裏:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity.aspx
,但它也說,在默認情況下你的進程分配給所有核心。另一方面,你可以嘗試ProcessThread.ProcessorAffinity並嘗試手動設置它(如果你想強制每個線程使用另一個核心)。
當Windows「停放」一個CPU內核時,這意味着該內核沒有足夠的工作來這樣做,它會使內核處於低功耗狀態。爲了「卸載」CPU,你只需要創建足夠的工作。
如果您正在啓動8個線程並且Windows沒有啓動CPU,那麼這些線程可能正在執行I/O,阻塞或完成得太快。如果你發佈你的線程正在做什麼,也許有人可以解釋爲什麼他們沒有在停放的核心上運行。
Win7/2K8R2將不會取消停放核心,直到其他的飽和或接近飽和。
停車核心的整點是鞏固工作。在80%的情況下使用4個內核比在40%的情況下使用8個內核更節能。此外,性能差異應該幾乎不存在。
此外,根據共享多少數據,整合工作實際上會更快,因爲涉及的硬件線程較少,因此會降低同步開銷。來自一個線程的最近數據更改將更可能在緩存中。
因此,常見的最壞情況是關於相同的性能和更少的功耗,常見的最佳情況是更好的性能和更少的功耗。
停車不受您的過程的CPU關聯設置控制,它由Windows CPU調度程序自動完成。調整CPU親和力可能會強制使用某些內核,但Windows只會停用不同的內核。根據系統負載,可以非常快速地動態打開或關閉停車。默認情況下它實際上非常具有侵略性(可能在某些平臺上太多了)。如您所見,您可以在資源監視器中觀看它。
設置你自己的CPU親和力是你應該做的事情極其謹慎。您必須考慮超線程核心,或者在AMD推土機的情況下,配對核心共享計算單元(它們的超線程,而不是超線程; p)。您不希望最終卡住超線程核心,該核心只提供真實核心性能的一小部分。 CPU調度程序知道這樣的事情,所以通常親和力最好留給它 - 除非你知道你在做什麼,並檢查了系統的CPU。
但是,您可以很容易地啓用/禁用或調整CPU停放,沒有重新啓動。我寫了一個操作方法,完成一個簡單的GUI,在這裏:How to Enable/Disable or Tweak CPU Parking Without a Reboot, and without Registry Edits
它還包括有關CPU停放,以及如何使用PowerCfg.exe來調整它的更多信息。實際上,您可以在Windows中的標準高級電源配置文件設置中顯示該選項,但需要進行一些調整,我不會進入這裏。
我有一個For-Loop做短操作(每個週期〜2-10ms),但它工作的列表可以容易地增長到200-300k。 答案似乎不適合我,因爲在我開始工作之前,4個CPU處於停放狀態,4個CPU正在工作......當我啓動我的程序時也是如此......並且有很多工作要做,另有4個內核可以大幅度提高表現。線程在20秒內不完成。沒有I/O操作完成。 – Steav 2011-02-07 13:50:27
其實我很擔心,因爲需要4個額外的核心,因爲操作仍然需要比在8核英特爾I7 – Steav 2011-02-07 13:55:24