簡體   English   中英

線程和核心

[英]Threading and cores

如果我的計算機上有X個內核,並且啟動了X個線程。 為了便於討論,我們假設每個線程在使用的內存,硬盤等方面都是完全分開的。 OS是要知道將每個線程發送到一個內核還是要花更多的時間在一個內核上切片多個線程? 問題歸結為:如果我具有X核,並且我的程序必須執行獨立的計算,是否應該啟動X線程,是否將它們分別輸送到一個核,或者是因為我擁有X核而可以啟動X?線程完全錯誤? 我在想 這是C#-

我要說不...

.NET團隊引入了TPL,以顯式委派線程執行以利用多個內核。 Windows Vista內置的智能不足以支持將線程委派給多個內核的操作系統。 考慮到Windows 7對多核的支持有了很大的改進,因此我不驚奇在.NET Framework(4.0)中看到這種改進。

這完全取決於每個線程要完成多少工作。 如果要在4核計算機上啟動4個線程並僅運行一個緊密循環,則很可能會消耗100%的CPU總時間。

上的K是否芯更寬的問題,給定k個線程和,操作系統將自動安排每個線程0-> K -1在芯0-> K -1,那么這不能保證。 通常,一旦線程將被安排運行,它將被分配給下一個可用的CPU。 但是,我相信該操作系統將是智能的,並且將嘗試重用該線程先前運行的同一內核,因為線程本地數據可能會緩存在該內核上。 但是,這就是說,在當今共享處理器緩存的世界中,這並不是良好的線程調度的先決條件。

您可以通過調用SetProcessorAffinity()方法來影響線程對給定內核的親和力。 但是,我傾向於避免這樣做,因為該操作系統通常非常擅長正確設置線程。

警告

跨多個線程的內存訪問不統一存在一些有趣的問題,即使不涉及鎖定,也會導致線程彼此阻塞。

假設您有很多值,並且希望n個線程對它們進行操作。 您必須確保每個線程訪問單獨的緩存行中的數據,以訪問其他線程訪問的數據-這是一個低級別的問題,不是使用.Net程序員(而是那些在C ++或更低級別的平台上長大的程序員)使用的問題去處理。

MSDN雜志的這篇文章很好地證明了該問題。 它使閱讀更有趣。

我想這可能取決於平台和操作系統。 根據我的經驗,如果需要從計算機中獲得盡可能多的性能,那么在Linux上使用C ++控制台應用程序時,在X內核上使用X線程是正確的選擇。 但是,請注意,任何並發任務(包括GUI)都將耗盡程序可用的CPU時間。 但是,在沒有GUI的專用服務器上,我的每個內核都有99-100%的程序專用。

由於C#使用本機線程,所以即使我的經驗主要是Java(在Windows上),我也可以發表評論。 通常,操作系統將嘗試平衡負載,因此,如果您在一個線程上最大化內核並執行大量計算任務,那么該內核上將調度很少的線程。

我最近使用任務框架編寫了一些CPU密集型多線程代碼,其中工作被分解為小任務並饋送到N個隊列。 每個隊列由一個線程擁有。 當我從1..X增加線程數時,我得到了線性加速,其中X是核心數。

因此,總的來說,答案是肯定的,您可以期望OS做正確的事情,尤其是隨着線程數量的增加和內核數量的增加。

通常,由OS調度程序將任務分配給正在執行的內核。 令N為要運行的任務數,令X為執行核心數。

如果N <X,除非您正在運行其他任務,否則您的計算機資源將無法充分利用。 如果N> = X,則是操作系統的“最佳意圖”,以在所有可用內核之間進行線程負載平衡。 實際上,除非您在每個任務線程上強制執行親和力,否則您不能保證所有任務都將在單獨的內核上運行。 事實是,如果您的舊操作系統不了解SMT處理器,它將被愚弄,並且可以在單個內核上分配多個任務,而其他內核則可能處於空閑狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM