Impacto da hyperthreading no desempenho do compilador?
-
19-09-2019 - |
Pergunta
dizer que queremos para compilar um projeto grande (digamos GCC ou o kernel Linux) o mais rápido possível. Será que uma CPU com capacidade de hyperthreading (dizem que um processador Intel Core i7) executar o compilador mais rápido com hyperthreading ativado ou desativado? Existe algum benchmark publicados que teste isso?
O meu entendimento de hyperthreading é que cada núcleo pode selecionar instruções de duas (ou mais processos). Isso geralmente faz com que o núcleo mais eficiente, uma vez que é menos provável que as unidades funcionais será ocioso. No entanto, há potencial para uma penalidade de desempenho já que os processos em execução no mesmo compartilhar recursos essenciais, tais como cache e pode interferir com o outro. Quer ou não o desempenho aumenta realmente depende da carga de trabalho.
Assim, para uma carga de trabalho do compilador, faz aumentar o desempenho? Se assim for, por quanto?
Solução
Compilando coreutils-8.4 no Ubuntu 8.04 x86
Intel Atom de 1,6 GHz com HT habilitado:
~/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$
Assim Hyper-Threading reduz o tempo de execução de 75%, o que é equivalente a
E aqui é um experimento de controle para mostrar que make -j2
sozinha não melhora a velocidade para compilar coreutils-8.4 no Ubuntu 8.04 x86
Single-core Core 2 Quad de 2,5 GHz VM (sem 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$
Outras dicas
Tudo depende se o compilador é escrito para ser multi-threaded ou não. Se for, então definitivamente HyperThreading acelera as coisas um pouco, desde então, o sistema operacional pode programar diferentes partes tópicos do compilador em diferentes núcleos. Concordo com Ken que compilações geralmente são mais I / O ligado do que o processamento intensivo, assim que ter um disco rígido rápido seria mais uma necessidade do que um processador rápido, com 100 dos núcleos.