Quanti thread fanno usare?

8

Quando ricostruisco sistemi di grandi dimensioni su un computer desktop / portatile, dico a make di utilizzare più thread per accelerare la velocità della compilation, in questo modo:

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

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

Quindi, ad esempio, potrei dire make -j12 se ho 4 core, indicando a make di usare fino a 12 thread.

Il mio fondamento logico è che, se utilizzo solo $C thread, i nuclei saranno inattivi mentre i processi sono occupati nel recupero dei dati dalle unità. Ma se non limito il numero di thread (cioè make -j ) corro il rischio di perdere tempo a cambiare contesto, esaurire la memoria, o peggio . Supponiamo che la macchina abbia $M di memoria (dove $M è nell'ordine di 10).

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

    
posta bitmask 12.07.2012 - 18:39
fonte

2 risposte

14

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

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

Il minimo sembra essere 7*$cores in questo caso.

    
risposta data 14.07.2012 - 17:56
fonte
3

Gestisco Gentoo Linux (distribuzione basata sull'origine) e dalla mia esperienza posso dire che (con hardware più o meno recente) n*2 + x è il valore migliore. Lasciami spiegare questo:

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

Tuttavia, devi eseguire alcuni test con alcuni valori di -j per ottenere il numero migliore. Inoltre, prova a parallelizzare altri passaggi del processo di creazione: decompressione, esecuzione configure e così via.

    
risposta data 13.07.2012 - 08:41
fonte

Leggi altre domande sui tag