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

StackOverflow https://stackoverflow.com/questions/2015134

Вопрос

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

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

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

Это было полезно?

Решение

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

Таким образом, гиперпоточность сокращает время выполнения до 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$

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top