22

假设我们想尽可能快地编译一个大型项目(比如 GCC 或 Linux 内核)。具有超线程功能的 CPU(比如 Intel Core i7)在启用或禁用超线程的情况下运行编译器的速度是否更快?是否有任何已发布的基准测试这一点?

我对超线程的理解是每个内核都可以从两个(或多个进程)中选择指令。这通常会使核心更高效,因为功能单元空闲的可能性较小。但是,由于在同一内核上运行的进程共享缓存等资源并且可能相互干扰,因此可能会降低性能。性能是否真正提高取决于工作负载。

那么对于编译器工作负载,性能会提高吗?如果是这样,多少?

4

2 回答 2

27

在 Ubuntu 8.04 x86 上编译 coreutils-8.4

启用了 HT 的 Intel Atom 1.6 GHz:

~/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 的速度

单核 Core 2 Quad 2.5 GHz VM(无 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$
于 2010-04-01T23:41:51.483 回答
0

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

于 2010-01-06T18:15:55.127 回答