【问题标题】:Multi-threaded make多线程制作
【发布时间】:2014-05-22 18:26:08
【问题描述】:

我可以使用make -jN 对make 进行多线程处理

我能否在 Makefile 中指定多线程,以便命令行中的 make 运行多个线程。这是我的生成文件:

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

all: $(HEX_OBJS)

$(HEX_OBJS): %.hex: %.bin
    python ../../tools/bin2h.py $< > $@

【问题讨论】:

  • 刚刚意识到我可以做all: $(MAKE) -j8 make2 或类似的事情,但希望有更好的选择
  • 您可以使用.NOTPARALLEL: 作为伪目标来抑制并行操作。除了命令行选项(参见GNU make manual)之外,我不知道强制并行的方法。

标签: multithreading makefile


【解决方案1】:

首先,要明确一点,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 $< > $@

【讨论】:

  • 设置MAX_PARALLEL = 8 并使用-j${MAX_PARALLEL} 可能是明智的,因此您可以在需要时覆盖命令行上的并行性。
  • @MadScientist 非常合适。谢谢
  • 不是同时运行多个命令,和运行多个线程一样吗?
  • 没有。运行多个命令就是多处理。区别在于资源访问:每个进程都有自己的内存和其他资源,由内核分开,没有进程可以访问另一个进程的资源(除非通过显式共享,但这是一个复杂的话题)。多个线程都在同一进程内运行,因此它们都可以访问相同的资源(只有少数位,“线程本地存储”,仅限于每个线程)。您可以在大多数操作系统上免费获得多处理。多线程要求您以特定的方式编写程序来支持它。
【解决方案2】:

如果发生make的文件系统是nfs共享,请小心使用-j。我看到了奇怪的结果,有人向我提到 nfs 挂载目录的操作方式不同(某种文件锁定问题?)

我从一个脚本运行我的 multi make 并检查了 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多