假设我们想尽快编译一个大型项目(比如GCC或Linux内核)。具有超线程功能的CPU(比如Intel Core i7)是否可以在启用或禁用超线程的情况下更快地运行编译器?是否有任何公布的基准测试可以测试这个?
我对超线程的理解是每个核心都可以从两个(或更多个进程)中选择指令。这通常使核心更有效,因为功能单元不太可能空闲。但是,由于在相同内核上运行的进程共享资源(如缓存)可能会相互干扰,因此可能会降低性能。性能是否实际增加取决于工作量。
因此,对于编译器工作负载,性能是否会提高?如果是这样,多少钱?
答案 0 :(得分:26)
在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$
答案 1 :(得分:0)
这完全取决于编译器是否被编写为多线程。如果是,那么绝对超线程可以加快速度,因为操作系统可以将编译器线程的不同部分安排到不同的内核上。我同意Ken的观点,编译通常比处理密集型更多地受I / O限制,因此拥有快速硬盘驱动器比使用100个内核的快速处理器更为必要。