假設我有一個多線程應用程序(比如~40個線程)在一個多處理器系統(比如8個內核)上運行,Linux作爲操作系統,其中不同的線程更基本上是LWP(輕量級進程)正在被內核調度。CPU親和力的優點和缺點
使用CPU親和力有什麼好處/缺點?通過將線程本地化爲核心子集,CPU親和力是否會有所幫助,從而最大限度地減少緩存共享/漏失?
假設我有一個多線程應用程序(比如~40個線程)在一個多處理器系統(比如8個內核)上運行,Linux作爲操作系統,其中不同的線程更基本上是LWP(輕量級進程)正在被內核調度。CPU親和力的優點和缺點
使用CPU親和力有什麼好處/缺點?通過將線程本地化爲核心子集,CPU親和力是否會有所幫助,從而最大限度地減少緩存共享/漏失?
調度程序已經嘗試將線程保留在相同的核心上並避免遷移。這表明在手動管理線程關聯時可能沒有很多里程數,除非:
我認爲實際上調度程序嘗試不會過熱內核,因此它實際上會嘗試在內核之間移動線程(如果運行一個忙等待線程,它將在多個內核之間遷移,而不是佔用一個內核的100%) – javapowered
本地化線程內核從而最大限度地減少高速緩存 共享的一個子集/錯過
不一定,你必須要考慮緩存一致性也一樣,如果兩個或多個線程訪問共享內存緩衝區並且每一個綁定到不同的CPU核心,如果一個線程寫入共享緩存行,則它們的緩存必須同步,否則會導致其他緩存失效。
如果你使用嚴格的親和性,那麼一個特定的線程必須在該處理器(或處理器組)上運行。如果你有很多線程完全獨立工作,並且它們的工作內存大於幾千字節,那麼在一個特定的內核上運行它不太可能會受益 - 因爲很可能其他線程運行在這個特定的CPU上會拋出任何一級緩存,而且很可能還會有二級緩存。哪一項對性能更重要 - 關鍵內容還是「更快跑步」?某些CPU總是空閒,還是每個內核的CPU負載都是100%?
但是,只有你知道(直到你告訴我們)你的線程正在做什麼。每次他們運行時,「工作集」有多大(他們接觸了多少內存 - 代碼和數據)?每個線程在運行時運行多久?什麼是與其他線程的交互?其他線程是否使用「this」線程共享數據?共享的模式有多少?
最後,最終的答案是「是什麼讓它跑得快?」 - 只有找到好的(現實的)基準並嘗試不同的可能選項才能找到答案。即使你給我們每一行代碼,爲每個線程運行時間測量等,我們只能做出或多或少的複雜猜測 - 直到經過嘗試和測試(使用VARYING使用模式)之前,幾乎不可能知道。
一般來說,我建議有很多線程要麼建議每個線程不是很忙(CPU方式),或者你「做錯了」......如果他們更多的線程不是更好都是平坦的 - 在這種情況下線程數量減少更好,因爲它們只是互相爭鬥。
您的意思是不斷準備好40個線程。在這種情況下,我沒有任何真正的應用程序(除了可能超載的數據庫服務器在這個領域,我不認爲這種混合親和力會幫助那裏)。爲什麼不嘗試使用測試應用程序並告訴我們? –
你說'多處理器系統(比如說8個核心)'。它是一個擁有8個內核的處理器還是2個處理器,每個內核有4個內核?在這兩種情況下,邏輯處理器(核心)的數量可能都是8。通過說CPU親和力,你考慮設置線程/進程與特定內核的親和性,或者?請澄清。 – Arno