2010-01-06 115 views
20

假设我们想尽可能快地编译一个大型项目(比如GCC或Linux内核)。具有超线程功能的CPU(比如英特尔酷睿i7)是否可以在启用或禁用超线程的情况下更快地运行编译器?有没有公​​布的基准测试?超线程对编译器性能的影响?

我对超线程的理解是每个内核都可以从两个(或多个进程)中选择指令。这通常会使核心更高效,因为功能单位不太可能闲置。但是,由于运行在相同内核上的进程共享资源(如缓存)并可能相互干扰,因此存在性能损失的可能性。性能是否实际上增加取决于工作量。

因此,对于编译器工作负载,性能是否会增加?如果是这样,多少?

+0

我没有近期的经验,但不编译往往是I/O绑定? – Ken 2010-01-06 18:12:53

+0

玩“make -j N”并测量不同N的系统资源? – 2010-01-06 18:17:28

+0

@Nikolai,如果我有一个超线程的CPU玩,我会。我在问这个问题,所以我知道购买一件是否值得。 – 2010-01-06 18:47:33

回答

26

编译的coreutils-8.4在Ubuntu 8.04 86

的Intel Atom 1.6 GHz的HT启用:

~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 2m33.375s 
user 2m22.873s 
sys  0m10.541s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 1m54.707s 
user 3m26.121s 
sys  0m13.821s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 2m33.372s 
user 2m22.753s 
sys  0m10.657s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 1m54.851s 
user 3m26.145s 
sys  0m13.685s 
~/coreutils-8.4$ 

所以超线程降低了运行时间75%,这相当于33%更多处理能力。 (我跑了他们两次,以确保一切都在内存中缓存。)

,这里是一个对照实验表明,单独make -j2不会提高速度在Ubuntu 8.04的x86编译的coreutils-8.4

单核心2四核2.5 GHz虚拟机(无HT):

~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 0m44.453s 
user 0m38.870s 
sys  0m5.500s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 0m45.131s 
user 0m40.450s 
sys  0m4.580s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make > /dev/null 

real 0m44.621s 
user 0m39.090s 
sys  0m5.340s 
~/coreutils-8.4$ make clean > /dev/null 
~/coreutils-8.4$ time make -j2 > /dev/null 

real 0m45.165s 
user 0m40.390s 
sys  0m4.610s 
~/coreutils-8.4$ 
+0

这太棒了。对照实验表明这确实有所作为。谢谢。 – 2010-04-02 15:55:03

+2

我希望看到在禁用HT的Atom上重复的测量,假设可以完成。此外,关于内存使用的说明会很好,因为Atom可能会开始交换或删除缓存,特别是在-j2情况下。 – Eroen 2013-04-05 12:46:47

+0

与Nehalem或Sandybridge系列CPU或AMD Ryzen相比,有序Atom在利用指令级并行性方面较差。 HT可能对Atom的帮助比对主流CPU的帮助更大。或者它可能会有所帮助,因为主流CPU具有更大的缓存和更多的执行资源(以及更高的分支误预测惩罚,而HT允许其他线程使用CPU,同时从错误推测中恢复)。所以HT也可能对主流CPU有很大的帮助,但这个比例可能会有很大的差异。 – 2017-08-18 02:31:53

0

这一切都取决于编译器是否写入多线程或不。如果是这样,那么肯定超线程技术可以加快速度,因为操作系统可以将编译器线程的不同部分安排到不同的内核上。我同意Ken的观点,即编译通常比处理密集型的I/O限制更多,因此拥有快速硬盘驱动器比拥有100个内核的快速处理器更为必要。

+0

如果使用make -j N(N是逻辑处理器的数量)调用编译器,那么该怎么办?我担心,由于不同的编译器进程不共享任何数据,它们实际上会降低性能。 – 2010-01-06 18:52:28

+2

1)只要有足够的物理内存,编译(无论如何Linux)总是可以非Io绑定的。 2)流行的构建系统可以并行调用多个编译器进程,从而使多线程编译器成为一个非问题。 (尽管连接器不那么) – Eroen 2013-04-05 12:44:21