Domanda

Sto cercando di ottimizzare il tempo di compilazione di un grande progetto VC ++. Il mio processore è un Core i7 950 (4 core, 8 thread poiché supporta la tecnologia Intel Hyper-Threading).

In Microsoft Visual Studio 2010, se vai a Strumenti> Opzioni> Progetti e soluzioni> Impostazioni progetto VC ++> Numero massimo di complilazioni C ++ simultanee

puoi selezionare il numero massimo di core della CPU da utilizzare per la compilazione C ++ parallela. Seleziono 0 lì (in modo che vengano utilizzati tutti i miei core), che produce esattamente gli stessi risultati di quando si utilizza 4 o 8.

Ora, se apro il Task Manager durante la compilazione del progetto, posso vedere che sono in esecuzione 4 thread di compilazione paralleli (sotto i processi hanno la descrizione: Driver del compilatore Microsoft C / C ++) e che l'utilizzo totale della CPU è un sempre un po 'meno del 50%.

Quindi la mia domanda è:

È possibile avere 8 thread di compilazione paralleli in un processore quad core, hyper-threaded? Se questo non è possibile, è possibile in qualche modo utilizzare quasi il 100% della potenza del processore durante la compilazione?

Questo mi farà risparmiare un'enorme quantità di tempo.

Grazie mille in anticipo,

Nicholas

È stato utile?

Soluzione

Questo mi farà risparmiare un'enorme quantità di tempo.

No, non lo sarebbe. L'hyperthreading è utile quando si hanno diversi tipi di attività da eseguire che utilizzano risorse complementari all'interno della CPU. Ad esempio, un thread utilizza molto virgola mobile e l'altro no. Mentre il primo esegue calcoli in virgola mobile, il resto della CPU è disponibile per l'altro thread.

Per ovvie ragioni, un mucchio di thread di compilazione vogliono le stesse risorse interne della CPU. Tutto ciò che otterresti è avere il doppio dei thread che combattono sulla cache e sulle risorse della CPU. Una maggiore contesa sulla cache renderebbe la vita più lenta, non più veloce.


Bene, quanto sopra spiega perché non otterrai GRANDI guadagni dall'hyperthreading e dal codice omogeneo. La saggezza convenzionale per la creazione parallela è impostare il numero di lavori maggiore di uno rispetto al numero di core, supponendo che i processi 1 / N stiano probabilmente eseguendo l'I / O del disco. Ovviamente, questo è per Unix make dove un lavoro esegue molte elaborazioni di makefile oltre alla compilazione effettiva.

Se hai ruotato la manopola fino a 8 e non hai visto alcun cambiamento (nota, potrebbe essere un cambiamento negativo nel throughput per i motivi spiegati sopra) nel Task Manager ha segnalato l'utilizzo della CPU, probabilmente è perché le interdipendenze nella tua soluzione stanno forzando alcune attività di compilazione da eseguire in sequenza. Se un'attività si basa sull'output di un'altra (le intestazioni precompilate spesso causano questo), allora ciò limita il numero di lavori simultanei - anche se avessi un sistema a 16 core, non avresti comunque più parallelismo di quello che consente la struttura del progetto.

Altri suggerimenti

Potrebbe essere che tu sia limitato solo dal disco invece che dalla CPU.

Penso che questo sia un problema con Visual Studio.Prova a eseguire i tuoi makefile con "jom" il clone parallelo di nmake.Dovresti vedere un aumento del 35% quando lo usi su msvc chiamato per compilare con 4 core.

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