Влияние гиперпотока на производительность компилятора?

Скажем, мы хотим как можно быстрее скомпилировать большой проект (например, GCC или ядро ​​Linux). Имеет ли процессор с возможностью hyperthreading (например, Intel Core i7) быстрее запускать компилятор с включенным или отключенным гиперпотоком? Есть ли опубликованные тесты, которые проверяют это?

Мое понимание гиперпоточности заключается в том, что каждое ядро ​​может выбирать команды из двух (или нескольких процессов). Это обычно делает ядро ​​более эффективным, поскольку менее вероятно, что функциональные блоки будут бездействовать. Однако существует потенциал для снижения производительности, поскольку процессы, выполняющиеся на одних и тех же основных ресурсах, таких как кеш, и могут мешать друг другу. Независимо от того, увеличивается ли производительность, зависит от рабочей нагрузки.

Итак, для рабочей нагрузки компилятора увеличивается производительность? Если да, то насколько?

Ответ 1

Компиляция 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

Одноядерный Core 2 Quad 2,5 ГГц 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$

Ответ 2

Все зависит от того, написан ли компилятор многопоточным или нет. Если это так, то определенная гиперпоточность ускоряет работу с тех пор, после чего ОС может планировать различные части потоков компилятора на разные ядра. Я согласен с Кеном в том, что компиляции, как правило, связаны с большей нагрузкой на ввод-вывод, чем интенсивность обработки, поэтому наличие скоростного жесткого диска будет более требовательным, чем быстрый процессор со 100 ядрами.