为什么make -j在传递的数量大于可用内核数量时表现更好?

时间:2011-01-26 07:14:41

标签: gcc makefile

我有一个hyper-threading的四核处理器。当我使用make -j8时,它比make -j4快(我读了Java中的核心数,然后调用make -j<number of cores>)。

我不明白为什么make -j32make -j8更快(当我用Java读取时)只有8个核心(超线程使物理核心数增加一倍)。怎么可能?

2 个答案:

答案 0 :(得分:21)

编译比CPU速度和可用内核数量更多:磁盘带宽和内存带宽也很重要。

在您的情况下,我想每个CPU HT兄弟大约需要执行4个进程。当它启动时,它会阻塞磁盘IO并进入下一个进程。第二个尝试打开第二个文件,阻止磁盘IO,并且兄弟会移动到下一个进程。在第一个磁盘IO就绪之前启动四个编译器并不会让我感到惊讶。

因此,当第一个最终读入程序源时,编译器必须开始搜索目录以找到#included文件。每个都需要一些open()调用,然后是read()调用,所有这些调用都可以阻塞,所有这些调用都会放弃兄弟,以便其他进程运行。

现在乘以8个兄弟姐妹 - 每个HT核心都将运行,直到它阻止内存访问,此时它将交换到其他兄弟,并运行一段时间。一旦第一个兄弟的内存被提取到缓存中,就可能是第二个兄弟在等待内存时停顿的时间。

使用make -j可以让你的编译运行速度有一个上限,但是对于我来说,两倍数的cpus对我来说是一个很好的起点。

答案 1 :(得分:1)

启动更多流程仍然可以为您带来好处。例如,一个进程可以使用CPU,而同一CPU上的另一个进程正在等待文件