Quanti fanno i thread da usare?


11

Quando (ri) costruisco sistemi di grandi dimensioni su un computer desktop / laptop, dico makedi usare più di un thread per accelerare la velocità di compilazione, in questo modo:

$ make -j$[ $K * $C ]

Dove $Csi suppone per indicare il numero di core (che possiamo assumere per essere un numero con una cifra) la macchina ha, mentre $Kè qualcosa che variano da 2a 4, a seconda del mio umore.

Quindi, ad esempio, potrei dire make -j12se ho 4 core, indicando makedi usare fino a 12 thread.


La mia logica è che se uso solo i $Cthread, i core saranno inattivi mentre i processi sono occupati a recuperare i dati dalle unità. Ma se non limito il numero di thread (ovvero make -j) corro il rischio di perdere tempo a cambiare contesto, a corto di memoria o peggio . Supponiamo che la macchina abbia dei $Mconcerti di memoria (dov'è $Mnell'ordine di 10).

Quindi mi chiedevo se esiste una strategia consolidata per scegliere il numero più efficiente di thread da eseguire.


In molti casi, la risposta corretta per il numero di thread sarà il numero di core. Ma l'unico modo per saperlo con certezza è eseguire alcuni test, variando il numero di thread fino a trovare il punto giusto.
Robert Harvey,

@RobertHarvey: Sì, probabilmente andrò a compilare uno script di shell con tutti i tipi di impostazioni durante la notte, ma ho pensato di chiedere se c'è qualche conoscenza al riguardo.
maschera di bit

4
molte persone suggeriscono anche $ core + 1, quindi 1 processo di compilazione legge dal disco mentre 4 compila. Un suggerimento generico è difficile, dipende anche dalla base di codice (uso eccessivo del modello C ++ rispetto alle piccole unità di compilazione con alcune funzioni C), dalla catena di compilatori (intestazioni precompilate ecc?) E dalla struttura di compilazione (collega solo una cosa importante nel fine o più piccole cose in mezzo)
johannes

1
Se stai cercando seriamente prestazioni, ti suggerirei di configurare un disco RAM o qualche altro metodo per alleviare l'I / O. Non penso che l'utilizzo della CPU sia il tuo punto di forza.
TMN,

@TMN: come può essere d'aiuto un disco RAM? Linux è abbastanza bravo a caching roba (si fa dire i file header, giusto?), Per non parlare della cache dell'unità. Prima dovrei caricare tutto in shm, manualmente o modificando lo script di build (che sarebbe assolutamente eccessivo).
maschera di bit

Risposte:


15

Ho eseguito una serie di test, costruendo llvm (in modalità Debug + Asserts) su una macchina con due core e 8 GB di RAM:

compilazione del tempo llvm in base al numero di lavori

Stranamente, sembra salire fino al 10 e poi improvvisamente scende al di sotto del tempo necessario per costruire con due lavori (un lavoro richiede circa il doppio tempo, non incluso nel grafico).

Il minimo sembra essere 7*$coresin questo caso.


1
+1 per test reali e non speculativi.
Martin Wickman,

3

Sto eseguendo Gentoo Linux (distribuzione basata sul sorgente) e dalla mia esperienza posso dire che (con hardware più o meno recente) n*2 + xè il miglior valore. Lasciami spiegare questo:

  • n*2: Anche le CPU più lente hanno una potenza sufficiente per eseguire 2 attività alla volta. la maggior parte delle attività di compilazione vengono completate molto velocemente.
  • +xquesto numero dipende dal sistema (principalmente memoria e disco). Se hai abbastanza RAM e un disco veloce, imposta x=n. Tuttavia, questo dipende dal codice sorgente (Open Office, ti sto guardando!) E dal linguaggio utilizzato (la compilazione di C / C ++ richiede molta memoria).

Tuttavia, è necessario eseguire alcuni test con alcuni -jvalori per ottenere il numero migliore. Inoltre, prova a parallelizzare altre fasi del processo di compilazione: decompressione, esecuzione configuree così via.


Al momento mi occupo principalmente di C ++, e credo che i miei dischi non siano i più veloci.
maschera di bit

Quindi inizia con n * 1.5 e aumentalo fino a quando i tempi di compilazione non diminuiscono (assicurati di pulire ogni volta la cache del disco / compilare la cache). Inoltre, pensa a utilizzare ccache ( ccache.samba.org ) per accelerare la compilazione.
Ercpe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.