2013-01-24 35 views
1

我有一個使用Intel TBB的32核心系統上運行的程序。 我遇到的問題是,當我將程序設置爲使用32個線程時,與16個線程(僅增加50%)相比,性能不夠好。但是,當我使用:linux中的taskset究竟做了什麼?

taskset 0xFFFFFFFF ./foo 

這將鎖定進程到32核心,性能要好得多。

我有兩個以下問題:

  1. 爲什麼?默認情況下,操作系統無論如何都會使用32個線程程序的全部32個內核。
  2. 我假設即使使用taskset,操作系統也可以(將)交換虛擬線程和物理線程,即線程不被固定。我對嗎?

謝謝。

+2

'操作系統會爲32個線程程序使用全部32個內核' - 你確定這個假設是有效的嗎? –

回答

3

操作系統可能會選擇使用較少的內核來實現緩存目的。想象一下,如果應用程序使用同一組內存,則每次寫入都會導致緩存失效。強制鎖定本質上是告訴操作系統併發的高速緩存開銷不值得,繼續使用所有內核。

您還必須記住還有其他進程需要運行(如來自內核的kthreads和後臺進程),並且在覈心之間遷移線程代價高昂,並且如果您的線程沒有進行大量工作,可能會導致失衡。

另外請記住,操作系統試圖平均分配所有進程的核心工作,而不僅僅是你的工作。這意味着負載均衡器可能會選擇不將進程放在所有32個內核上,因爲當前有其他進程正在運行,並且遷移成本可能很高或者均勻分佈您的進程可能會導致CPU內核之間的負載不平衡。操作系統努力獲得最佳的系統性能,但不一定是每個應用程序性能最好

+0

你能再解釋一下,爲什麼操作系統可能會使用更少的內核? – Yamcha

+0

@ user1316459緩存一致性很高。有時最好在少量內核上放置進程,以減少緩存失效和一致性問題(因爲它們可能共享L1/L2緩存)。如果他們都在獨立的核心上,他們可能只是彼此跨越。另一個原因是CPU利用率和系統上運行的其他進程。 –

+0

所以,你說對於多線程程序,默認情況下,操作系統使用的內核數量少於提高性能所需的內核數量? – Yamcha