Влияние гиперпоточности на производительность компилятора?
-
19-09-2019 - |
Вопрос
Допустим, мы хотим скомпилировать большой проект (скажем, 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 ядрами.