Impatto della hyperthreading sulle prestazioni del compilatore?
-
19-09-2019 - |
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?
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.