有多少个使用线程?


11

当我在台式机/笔记本电脑上(重新)构建大型系统时,我告诉我make使用多个线程来加快编译速度,如下所示:

$ make -j$[ $K * $C ]

$C应该在哪里指示机器拥有的内核数量(我们可以假设它是一位数字),而根据我的心情,$K我从2到有所不同4

因此,例如,我可能会说make -j12我是否有4个核心,这表示make要使用多达12个线程。


我的基本原理是,如果仅使用$C线程,则内核将在进程忙于从驱动器中获取数据时处于空闲状态。但是,如果我不限制线程数(即make -j),那我就有浪费时间切换上下文,耗尽内存什至更糟的风险。假设计算机具有$M千兆内存($M大约为10)。

所以我想知道是否有一个确定的策略来选择运行效率最高的线程数。


在许多情况下,线程数量的正确答案将是核心数量。但是,唯一可以确定的方法是运行一些测试,更改线程数,直到找到最佳结果为止。
罗伯特·哈维

@RobertHarvey:是的,我可能会去过夜,并用各种设置编译一个Shell脚本,但我想我想问一下是否对此有所了解。
bitmask

4
许多人还建议$ cores + 1,因此1个编译器进程从磁盘读取数据,而4个则从磁盘读取。一个通用的建议很难,还取决于代码库(C ++模板的过度使用与带有几个C函数的小型编译单元),编译器链(预编译的标头等?)和构建结构(它是否只是链接了结束或介于两者之间的多个小物件)
johannes 2012年

1
如果您正在认真寻找性能,建议您考虑设置RAM磁盘或其他减轻I / O的方法。我认为CPU利用率不是您的热点。
TMN 2012年

@TMN:RAM磁盘如何提供帮助?Linux是在缓存的东西(你相当不错的的意思是头文件,对吧?),更不用说驱动器高速缓存。我将必须首先手动或通过更改构建脚本将所有内容加载到shm中(这完全是过大的)。
bitmask

Answers:


15

我进行了一系列测试,在具有两个内核和8 GB RAM的计算机上构建llvm(在Debug + Asserts模式下):

根据作业数编译llvm时间

奇怪的是,它似乎爬升到10,然后突然下降到构建两个作业所需的时间以下(一个作业大约需要两倍的时间,未包含在图中)。

最小似乎是7*$cores在这种情况下。


1
+1用于实际测试而不是推测。
马丁·威克曼

3

我正在运行Gentoo Linux(基于源的发行版),根据我的经验,我可以说(具有或多或少的最新硬件)n*2 + x是最好的价值。让我解释一下:

  • n*2:即使速度较慢的CPU也有足够的能力一次运行2个任务。大多数编译任务很快完成。
  • +x此数字取决于您的系统(主要是内存和磁盘)。如果您有足够的RAM和快速磁盘,请设置x=n。但是,这取决于源代码(Open Office,我在看着您!)和使用的语言(编译C / C ++占用大量内存)。

但是,您必须使用某些-j值运行一些测试才能获得最佳数值。另外,请尝试并行化构建过程的其他步骤:解包,运行configure等。


目前,我最关心的是C ++,我的磁盘并不是最快的。
bitmask

然后从n * 1.5开始并增加它,直到编译时间停止减少(确保每次都清洁磁盘缓存/编译缓存)。另外,考虑使用ccache(ccache.samba.org)加快编译速度。
ercpe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.