2014-05-22 106 views
6

我可以多線程一個湊合着make -jN多線程使

我可以決定多線程 Makefile文件,以便在命令行只是make運行多個線程。這是我的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

剛剛意識到我可以做'都:$(MAKE)-j8 make2'或這樣的事情,但希望有一個更好的選擇 – user1088084

+0

可以禁止以'.NOTPARALLEL:'作爲僞目標的並行操作。我沒有意識到強制並行的方式,而不是命令行選項(參見[GNU'make' manual](http://www.gnu.org/software/make/manual/make.html#Parallel)) 。 –

回答

12

首先,要清楚,make不是多線程的。使用-j只是告訴make同時運行多個命令(基本上在後臺運行)。

其次,不能從makefile中啓用多個作業。總的來說,您不希望這樣做,因爲其他系統的內核數量不同,您選擇的任何值在這些系統上效果不佳。

您不必寫多個makefile文件,不過,你可以使用:

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

設置MAX_PARALLEL = 8'並使用'-j $ {MAX_PARALLEL}'可能是明智的,這樣您就可以在需要時覆蓋命令行上的並行性。 –

+1

@MadScientist非常適合。謝謝 – user1088084

+0

不是同時運行多個命令,就像運行多個線程一樣? –

2

小心使用-j如果在化妝發生文件系統是NFS共享。我看到了奇怪的結果,並提到我nfs安裝目錄的操作方式不同(某種文件鎖定問題?)

我跑了我的多從一個腳本並檢查cpuinfo找出有多少個處理器的構建框有(正在運行相同的腳本針對多種架構/建機)

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"