2014-05-22 66 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"