一个内衬用于n-1芯?

时间:2017-03-17 16:24:51

标签: bash math makefile jobs

使用标志-j运行make会使用所有可用内核,但这有时会导致线程崩溃或其他不良事件发生。

在bash脚本中,我如何使用n-1内核(仅当n>1否则为1)。

必须有一种比这更简单的方法:

NJOBS=$((`getconf _NPROCESSORS_ONLN 2>/dev/null \
   || sysctl hw.ncpu  \
   || echo 2` \
   - 1))

2 个答案:

答案 0 :(得分:3)

您当前代码不简单的全部原因是它正在尝试执行跨多个操作系统没有标准化接口的操作。因此,为了尽可能获得适用于当前操作系统的方法,它会经历多种可能性:

  • getconf _NPROCESSORS_ONLN适用于Linux和MacOS X,但不适用于Solaris,FreeBSD,NetBSD等。
  • sysctl hw.ncpu适用于大多数非Solaris系统。
  • 2是一个安全的默认值,因为减去1将返回仅一个核心的值。

要在Solaris上工作,可能需要将psrinfo -p添加到可能的回退列表中,从而使您的代码甚至更多详细。

如果您愿意稍微牺牲一下可移植性(但仍然保留最后一个回退,那么如果在Solaris上运行我们就不会完全失败),

ncores=$(sysctl hw.ncpu); njobs=$(( ncores > 1 ? (ncores - 1) : 1 ))

可能是一个合理的折衷方案(处理案例,原件没有,成功返回1的值)。

答案 1 :(得分:1)

make中的-j参数可以使用关于要使用的核心数量的参数。因此,您可以执行以下操作:

CORES := $(shell grep -c ^processor /proc/cpuinfo)
JFLAG := $(shell  echo "-j$$(( $(CORES) - 1 ? $(CORES) - 1 : 1 ))"

all:
    $(MAKE) $(JFLAG) _some_sub_makefile..._

如果您希望make覆盖传递给它的-j标志,则执行以下操作:

ifeq (,$(filter DASHJSET,$(MAKECMDGOALS)))

ABSPATH := $(abspath $(lastword $(MAKEFILE_LIST)))

CORES := $(shell grep -c ^processor /proc/cpuinfo)
JFLAG := $(shell  echo "-j$$(( $(CORES) - 1 ? $(CORES) - 1 : 1 )))"

all:
    $(MAKE) -C $(ABSPATH) $(JFLAG) DASHJSET $(MAKECMDGOALS)

.PHONY: DASHJSET

fi