Compilazione con g ++ usando più core
-
03-07-2019 - |
Domanda
Domanda rapida: qual è il flag del compilatore per consentire a g ++ di generare più istanze di se stesso per compilare più rapidamente progetti di grandi dimensioni (ad esempio 4 file sorgente alla volta per una CPU multi-core)?
Soluzione
Puoi farlo con make - con gnu make è il flag -j (questo aiuterà anche su una macchina uniprocessore).
Ad esempio, se si desidera creare 4 lavori paralleli da:
make -j 4
Puoi anche eseguire gcc in una pipe con
gcc -pipe
In questo modo verranno condotte le fasi di compilazione, che aiuteranno anche a mantenere occupati i core.
Se sono disponibili anche macchine aggiuntive, è possibile controllare distcc , che verrà compilato per compilare quelle anche.
Altri suggerimenti
Non esiste tale flag e avere una corsa contro la filosofia Unix secondo cui ogni strumento esegue una sola funzione ed esegue bene. La generazione dei processi del compilatore è concettualmente il lavoro del sistema di compilazione. Quello che probabilmente stai cercando è il flag -j (jobs) di GNU make, a la
make -j4
Oppure puoi usare pmake o sistemi di creazione parallela simili.
Le persone hanno menzionato make
ma bjam
supporta anche un concetto simile. L'uso di bjam -jx
indica a bjam di compilare fino a x
comandi simultanei.
Utilizziamo gli stessi script di build su Windows e Linux e l'utilizzo di questa opzione dimezza i nostri tempi di compilazione su entrambe le piattaforme. Nizza.
make
farà questo per te. Indaga sulle opzioni -j
e -l
nella pagina man. Non credo che g ++
sia parallelizzabile.
distcc può anche essere usato per distribuire compilazioni non solo sulla macchina corrente, ma anche su altre macchine in una farm su cui è installato distcc.
Se si utilizza make, rilasciare con -j
. Da man make
:
-j [jobs], --jobs[=jobs] Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.
E in particolare, se si desidera eseguire lo script o identificare il numero di core disponibili (a seconda del proprio ambiente e se si esegue in molti ambienti, questo può cambiare molto) è possibile utilizzare la funzione onnipresente di Python cpu_count ()
:
https://docs.python.org/3/library /multiprocessing.html#multiprocessing.cpu_count
In questo modo:
make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')
Se stai chiedendo perché 1.5
citerò l'utente senza rumore in un commento sopra:
Il numero 1.5 è a causa del problema associato I / O associato. È una regola empirica. Circa 1/3 dei lavori saranno in attesa di I / O, quindi i lavori rimanenti utilizzeranno i core disponibili. Un numero maggiore dei core è migliore e potresti persino arrivare fino a 2 volte.
Non sono sicuro di g ++, ma se stai usando GNU Make allora " make -j N " (dove N è il numero di thread che possono creare) consentirà a make di eseguire più lavori g ++ contemporaneamente (purché i file non dipendano l'uno dall'altro).
GNU parallelo
Stavo trasformando un benchmark di compilazione sintetico e non potevo mi preoccupo di scrivere un Makefile, quindi ho usato:
sudo apt-get install parallel
ls | grep -E '\.c
Spiegazione:
-
{.}
accetta l'argomento input e ne rimuove l'estensione
-
-t
stampa i comandi in esecuzione per darci un'idea dei progressi
-
--will-cite
rimuove la richiesta di citare il software se si pubblicano risultati utilizzandolo ...
parallel
è così conveniente che potrei anche fare un controllo di data e ora:
ls | grep -E '\.c
xargs -P
può anche eseguire lavori in parallelo, ma è un po 'meno conveniente eseguire la manipolazione dell'estensione o eseguire più comandi con esso: Chiamare più comandi tramite xargs
È stato richiesto il collegamento parallelo all'indirizzo: Gcc può utilizzare più core durante il collegamento?
TODO: Penso di aver letto da qualche parte che la compilazione può essere ridotta alla moltiplicazione matriciale, quindi forse è anche possibile accelerare la compilazione di singoli file per file di grandi dimensioni. Ma non riesco a trovare un riferimento ora.
Testato in Ubuntu 18.10.
| parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"
Spiegazione:
-
{.}
accetta l'argomento input e ne rimuove l'estensione
-
-t
stampa i comandi in esecuzione per darci un'idea dei progressi
-
--will-cite
rimuove la richiesta di citare il software se si pubblicano risultati utilizzandolo ...
parallel
è così conveniente che potrei anche fare un controllo di data e ora:
<*>
xargs -P
può anche eseguire lavori in parallelo, ma è un po 'meno conveniente eseguire la manipolazione dell'estensione o eseguire più comandi con esso: Chiamare più comandi tramite xargs
È stato richiesto il collegamento parallelo all'indirizzo: Gcc può utilizzare più core durante il collegamento?
TODO: Penso di aver letto da qualche parte che la compilazione può essere ridotta alla moltiplicazione matriciale, quindi forse è anche possibile accelerare la compilazione di singoli file per file di grandi dimensioni. Ma non riesco a trovare un riferimento ora.
Testato in Ubuntu 18.10.
| parallel -t --will-cite "\
if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
gcc -c -o '{.}.o' '{}'
fi
"
xargs -P
può anche eseguire lavori in parallelo, ma è un po 'meno conveniente eseguire la manipolazione dell'estensione o eseguire più comandi con esso: Chiamare più comandi tramite xargs
È stato richiesto il collegamento parallelo all'indirizzo: Gcc può utilizzare più core durante il collegamento?
TODO: Penso di aver letto da qualche parte che la compilazione può essere ridotta alla moltiplicazione matriciale, quindi forse è anche possibile accelerare la compilazione di singoli file per file di grandi dimensioni. Ma non riesco a trovare un riferimento ora.
Testato in Ubuntu 18.10.
| parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"Spiegazione:
-
{.}
accetta l'argomento input e ne rimuove l'estensione -
-t
stampa i comandi in esecuzione per darci un'idea dei progressi -
--will-cite
rimuove la richiesta di citare il software se si pubblicano risultati utilizzandolo ...
parallel
è così conveniente che potrei anche fare un controllo di data e ora:
xargs -P
può anche eseguire lavori in parallelo, ma è un po 'meno conveniente eseguire la manipolazione dell'estensione o eseguire più comandi con esso: Chiamare più comandi tramite xargs
È stato richiesto il collegamento parallelo all'indirizzo: Gcc può utilizzare più core durante il collegamento?
TODO: Penso di aver letto da qualche parte che la compilazione può essere ridotta alla moltiplicazione matriciale, quindi forse è anche possibile accelerare la compilazione di singoli file per file di grandi dimensioni. Ma non riesco a trovare un riferimento ora.
Testato in Ubuntu 18.10.