我有一個四核處理器hyper-threading。當我使用make -j8
它的速度比make -j4
(我讀的Java核心數量,然後叫make -j<number of cores>
)。爲什麼make -j在通過比可用內核數量更多的數字時執行得更好?
我不明白爲什麼make -j32
比我的(讀入Java)時只有8個內核(超線程使物理內核數量增加一倍)的速度快於make -j8
。這怎麼可能?
我有一個四核處理器hyper-threading。當我使用make -j8
它的速度比make -j4
(我讀的Java核心數量,然後叫make -j<number of cores>
)。爲什麼make -j在通過比可用內核數量更多的數字時執行得更好?
我不明白爲什麼make -j32
比我的(讀入Java)時只有8個內核(超線程使物理內核數量增加一倍)的速度快於make -j8
。這怎麼可能?
還有更多的編譯比CPU速度以及可用核數一個進程可以使用CPU。
在你的情況,我想,每個CPU HT兄弟越來越大約4個進程來執行。當它啓動時,它會阻塞磁盤IO並轉到下一個進程。第二個嘗試打開第二個文件,在磁盤IO上阻塞,並且兄弟移動到下一個進程。在第一個磁盤IO準備好之前啓動四個編譯器並不會讓我感到驚訝。
所以,當第一次在節目源終於看完,編譯器必須開始通過目錄狩獵找到包含(#include)文件。每一個都需要一些open()調用,然後是read()調用,所有這些都可以阻塞,並且所有這些都會放棄其他進程運行的同級。
現在,乘那八個兄弟姐妹 - 每個HT核心將運行至內存訪問塊,這時它會換到其他的兄弟姐妹,並運行了一段時間。一旦第一個兄弟的內存被提取到緩存中,第二個兄弟就可能在等待內存時停頓。
通過使用make -j
可以讓您的編譯運行速度提高多少,但在過去,對於我來說,兩倍數量的cpus是一個很好的起點。
啓動多個進程仍然有可能給你帶來好處。磁盤帶寬和內存帶寬太重要了很多:例如,在同一個CPU上的另一個進程正在等待文件