2014-05-22 9 views
6

posso multi-thread un make con make -jNMulti-threaded rendono

Posso dettare multithreading all'interno il Makefile in modo che solo make dalla riga di comando esegue più thread. Ecco il mio makefile:

BIN_OBJS = $(wildcard *.bin) 
HEX_OBJS = $(subst .bin,.hex,$(BIN_OBJS)) 

all: $(HEX_OBJS) 

$(HEX_OBJS): %.hex: %.bin 
    python ../../tools/bin2h.py $< > [email protected] 
+0

appena reso conto che potevo fare 'tutto: $ (MAKE) -j8 make2' o qualcosa di simile, ma si spera che ci sia una soluzione migliore – user1088084

+0

È possibile sopprimere operazione parallela con '.NOTPARALLEL:' come pseudo-obiettivo. Non sono a conoscenza di un modo per forzare il parallelismo oltre alle opzioni della riga di comando (vedi [manuale GNU 'make'] (http://www.gnu.org/software/make/manual/make.html#Parallel)) . –

risposta

12

Innanzitutto, per essere chiari, make non è multi-thread. L'utilizzo di -j dice semplicemente di eseguire più comandi contemporaneamente (in fondo, in pratica).

In secondo luogo, no, non è possibile abilitare più lavori all'interno del makefile. Non lo si vuole fare, in generale, comunque perché gli altri sistemi avranno un numero diverso di core e qualsiasi valore scelto non funzionerà bene su quei sistemi.

Non devi scrivere più makefile, però, si può semplicemente utilizzare:

BIN_OBJS = $(wildcard *.bin) 
HEX_OBJS = $(subst .bin,.hex,$(BIN_OBJS)) 

.PHONY: all multi 
multi: 
     $(MAKE) -j8 all 

all: $(HEX_OBJS) 

$(HEX_OBJS): %.hex: %.bin 
     python ../../tools/bin2h.py $< > [email protected] 
+1

Potrebbe essere sensato impostare 'MAX_PARALLEL = 8' e usare' -j $ {MAX_PARALLEL} 'in modo da poter sovrascrivere il parallelismo sulla riga di comando quando desiderato. –

+1

@MadScientist che è perfettamente adatto. Grazie – user1088084

+0

non è in esecuzione più comandi contemporaneamente, come nell'esecuzione di più thread? –

2

Fare attenzione usando -j se il filesystem in cui la marca si sta verificando è una condivisione NFS. Ho visto risultati strani e ho notato che le directory montate su nfs funzionano in modo diverso (una sorta di problema di blocco dei file?)

Ho eseguito il mio multiprodotto da uno script e controllato cpuinfo per scoprire quanti processori la casella di compilazione avuto (era in esecuzione nello stesso script su più architetture/costruire macchine)

CPUCOUNT=$(grep -c "^processor" /proc/cpuinfo) 

if [ ${CPUCOUNT} -lt 1 -o ${CPUCOUNT} -gt 4 ] 
then 
    echo "Unexpected value for number of cpus, ${CPUCOUNT}, exiting ..." 
    exit 16 
fi 

echo "This machine has ${CPUCOUNT} cpus, will use make -j${CPUCOUNT} where possible"