Se abbiamo un processore multicore o più processori, per compilare più velocemente sfruttando il parallelismo, possiamo dare make con l’opzione -jn dove n sta per il numero di processori più 1. Oppure per fare in modo che ad ogni compilazione questo sia impostato di default basta impostare la variabile d’ambiente CONCURRENCY_LEVEL. Ma perché numero_processori+1? Tindal mi ha dato la risposta che copio ed incollo qui
il concurrency level va impostato ad un numero maggiore rispetto al numero di processori (o core), se vuoi risparmiare più tempo possibile parallelizzando i processi, per assicurare che ci sia sempre un processo ovviabile quando c’è un po’ di tempo di calcolo disponibile
ogni processo ha dei periodi in cui non riesce ad usare al massimo il processore: se hai 2 processori e 2 processi avrai qualche tempo morto per entrambi i processi, e il fatto di averne almeno un altro in esecuzione ti permette di usare anche questi tempi morti
bada che di solito parliamo di poco (penso che nella compilazione di un kernel puoi guadagnare al max 10-20 secondi, a occhio), ma dipende dai processi: più ci sono tempi morti più guadagni aumentando il numero di processi concorrenti
ah, ovviamente non riuscirai a fare molto altro con il pc mentre lo tieni così occupato
Ora daremo l’esempio più classico per i desktop moderni: due core (naturalmente vale sia per AMD che INTEL o altro…)
Per archlinux (o simili)
sudo nano /etc/profile
e aggiungiamo la riga
CONCURRENCY_LEVEL=3
export CONCURRENCY_LEVEL
poi
source /etc/profile
Prova che funzioni
echo $CONCURRENCY_LEVEL
Se invece intendete sfruttare per intero il multicore anche per makepkg leggere il wiki di archlinux e se non volete perdervi con l’inglese una buona lettura è anche questa guida di gentoo sui flags per l’ottimizzazione di gcc.
Per debian (o simili)
sudo nano /etc/environment
e aggiungiamo la riga
CONCURRENCY_LEVEL=3
export CONCURRENCY_LEVEL
poi
source /etc/environment
Prova che funzioni
echo $CONCURRENCY_LEVEL
Attenzione
In realtà non è sempre consigliabile dare compilazioni parallele, dipende dal programma, dal codice, dal Makefile ecc ecc…Quindi è utile averlo globalmente se e solo se quello che compiliamo di solito gradisce sfruttare al massimo il multicore/multiprocessore durante la compilazione (e per me risulta sempre così, compreso ricompilazione kernel).




Luglio 21, 2008 a 7:41 pm
[...] il makeflags è il parente di concurrency_level, fanno la stessa identica cosa (più o [...]