Скажите, что мы хотим скомпилировать крупный проект (скажите что GCC или ядро Linux), максимально быстро. ЦП с возможностью гиперпоточности (говорят, что Core i7 Intel), запускает компилятор немного быстрее с гиперпоточностью, включенной или отключенной? Там кто-либо публикуется сравнительные тесты, которые тестируют это?
Мое понимание гиперпоточности - то, что каждое ядро может выбрать инструкции от два (или больше процессов). Это обычно делает ядро более эффективным, так как менее вероятно, что функциональные блоки будут неактивны. Однако существует потенциал для потери производительности начиная с процессов, работающих на тех же базовых ресурсах доли, таких как кэш, и может вмешаться друг в друга. Увеличивается ли производительность на самом деле, зависит от рабочей нагрузки.
Таким образом для рабочей нагрузки компилятора, производительность увеличивается? Если так, сколько?
Компиляция coreutils-8.4 в Ubuntu 8.04 x86
Intel Atom 1,6 ГГц с включенным 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$
Таким образом, Hyper-Threading сокращает время выполнения до 75%, что эквивалентно увеличению вычислительной мощности на 33% . (Я запускал их дважды, чтобы убедиться, что все находится в кеше памяти.)
А вот контрольный эксперимент, показывающий, что make -j2
сам по себе не улучшает скорость компиляции coreutils-8.4 в Ubuntu 8,04 x86
Одноядерное ядро 2 Quad 2,5 ГГц ВМ (без 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$
Все зависит от того, записан ли компилятор многопоточным или нет. Если это так, то определенно гиперпоточность немного ускоряет процесс, так как тогда операционная система может планировать различные части потоков компилятора на разные ядра. Я согласен с Кеном, что компиляторы обычно более связаны по объему ввода/вывода, чем интенсивно обрабатывают, так что наличие скоростного жесткого диска было бы более необходимым, чем наличие скоростного процессора со 100 ядрами
.