Domanda

dire che vogliamo compilare un progetto di grandi dimensioni (ad esempio GCC o il kernel Linux) il più velocemente possibile. Ha una CPU con capacità di hyperthreading (diciamo un Intel Core i7) eseguire il compilatore più veloce con hyperthreading attivato o disattivato? Ci sono dei punti di riferimento pubblicati che mettono alla prova questo?

La mia comprensione di hyperthreading è che ogni core può scegliere istruzioni da due (o più processi). Questo di solito rende il cuore più efficiente, in quanto è meno probabile che le unità funzionali saranno inattivo. Tuttavia, c'è potenziale per una riduzione delle prestazioni in quanto i processi in esecuzione sugli stessi condividere risorse fondamentali come cache e possono interferire tra loro. O meno le prestazioni in realtà aumenta dipende dal carico di lavoro.

Quindi, per un carico di lavoro del compilatore, non aumentare le prestazioni? In caso affermativo, di quanto?

È stato utile?

Soluzione

Compilazione coreutils-8.4 su Ubuntu 8.04 x 86

Intel Atom 1,6 GHz con HT abilitato:

~/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$

Quindi diFilettatura riduce il tempo di funzionamento al 75%, che è equivalente a 33% maggiore potenza di elaborazione . (Mi sono imbattuto due volte a garantire che tutto ciò che si trova nella cache di memoria.)

E qui è un esperimento di controllo per dimostrare che make -j2 da sola non migliora la velocità per la compilazione coreutils-8.4 su Ubuntu 8.04 x 86

Single-core Core 2 Quad 2,5 GHz VM (senza 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$

Altri suggerimenti

Tutto dipende se il compilatore è stato scritto per essere multi-threaded o meno. Se lo è, allora sicuramente hyperthreading velocizza cose un po 'da allora il sistema operativo può programmare diverse parti di fili del compilatore su diversi nuclei. Sono d'accordo con Ken che compilazioni sono generalmente più I / O bound di elaborazione intensiva, quindi avere un veloce disco rigido sarebbe più di una necessità di un processore veloce con 100 di core.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top