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?

Foi útil?

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 33% de potência mais processamento . (Eu corri duas vezes para garantir que tudo está no cache de memória.)

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top