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)?

È stato utile?

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.

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