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

Gcc 为什么make-j在传递的数量大于可用内核数量时性能更好?,gcc,makefile,Gcc,Makefile,我有一个四核处理器。当我使用make-j8时,它比make-j4快(我用Java读取内核数,然后调用make-j) 我不明白为什么make-j32比make-j8快,而我(用Java阅读)只有8个内核(超线程使物理内核的数量增加了一倍)。这怎么可能 启动更多流程仍然可能给您带来好处。例如,一个进程可以使用CPU,而同一CPU上的另一个进程正在等待文件除了CPU速度和可用的内核数量之外,编译还有更多的内容:磁盘带宽和内存带宽 在您的例子中,我设想每个CPU HT同级大约要执行4个进程。当它启动一个

我有一个四核处理器。当我使用
make-j8
时,它比
make-j4
快(我用Java读取内核数,然后调用
make-j


我不明白为什么
make-j32
make-j8
快,而我(用Java阅读)只有8个内核(超线程使物理内核的数量增加了一倍)。这怎么可能

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

除了CPU速度和可用的内核数量之外,编译还有更多的内容:磁盘带宽和内存带宽

在您的例子中,我设想每个CPU HT同级大约要执行4个进程。当它启动一个进程时,它会阻塞磁盘IO并进入下一个进程。第二个进程尝试打开第二个文件,阻塞磁盘IO,同级进程进入下一个进程。在第一个磁盘IO准备就绪之前启动四个编译器不会让我感到惊讶

因此,当第一个最终读入程序源代码时,编译器必须开始搜索目录,以找到包含的文件。每个进程都需要一些open()调用,然后是read()调用,所有这些调用都会阻塞,并且所有这些调用都会放弃同级进程以供其他进程运行

现在将其乘以八个同级——每个HT内核将运行,直到它阻塞内存访问,在这一点上它将切换到另一个同级,并运行一段时间。一旦第一个同级的内存被提取到缓存中,第二个同级在等待内存时可能会暂停


使用
make-j
可以使编译器运行的速度达到上限,但在过去,两倍数量的CPU对我来说是一个很好的起点。

磁盘IO在缓存Linux之类的OSs时不应该是一个问题(在首次运行
make
之后)。同一HT内核中的线程将竞争缓存空间,因此其好处也毫无疑问。