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

Dam*_*mir 20 gcc makefile

我有一个带有超线程的四核处理器.当我使用make -j8它比make -j4(我读取Java中的核心数然后调用make -j<number of cores>)更快.

我不明白为什么make -j32make -j8我(只读Java)只有8个内核(超线程使物理内核的数量翻倍)更快.怎么可能?

sar*_*old 22

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

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

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

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

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