Влияние гиперпоточности на производительность компилятора? - PullRequest
21 голосов
/ 06 января 2010

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

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

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

Ответы [ 2 ]

26 голосов
/ 02 апреля 2010

Компиляция 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 ГГц (без 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 голосов
/ 06 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...