2017-03-17 7 views
2

フラグを付けてmakeを実行すると、使用可能なすべてのコアが使用されますが、スレッドによってはスラッシュやその他の悪いことが発生することがあります。n-1コア用に1本のライナー?

代わりにn-1コアを使用するにはどうすればいいですか(n>1以外の場合は1)。

これよりもそれを行うための簡単な方法が存在しなければならない:

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

:あなたはあなたのメイクがそれに渡された-jフラグを無効にしたい場合は

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

は、あなたのような何かを実行します。したがって、あなたのような何かを行うことができますall-capsは良い形式ではありません - 環境変数に関する[POSIX第7号の仕様](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html)を参照してください。名前はオペレーティングシステムとシェルにとって意味のある変数に使用され、少なくとも1つの小文字の名前はアプリケーション用に予約されています。シェル変数を設定すると、同じ名前の環境変数が上書きされるため、この慣例も同様に適用されます。 –

+0

それほど簡単ではないソリューションでも、 'n = 1'の場合や何かが欠けていますか? – 5gon12eder

答えて

3

あなたの現在のコードは単純ではありません全体の理由は、複数にわたる標準化インタフェースを持っていない操作を実行しようとしているということですオペレーティングシステム。

  • getconf _NPROCESSORS_ONLN LinuxとMacOS Xの上の作品ではなく、Solaris版、FreeBSDの、NetBSDの、など:このように、現在のオペレーティングシステム上で動作するアプローチを持っていることの可能な限り最高のチャンスを持っている、それは複数の可能性を通過します
  • sysctl hw.ncpuは、ほとんどのSolaris以外のシステムで動作します。
  • 2は1を減算すると1つのコアだけの値が返されるため、安全なデフォルトです。

Solaris上で動作するように、1は、このようにしてもより冗長なコードを作ることができフォールバックのリストにpsrinfo -pを追加したいと思います。


あなたは少し移植性を損なうこと(まだSolaris上で実行した場合、我々は全く失敗しないので、土壇場のフォールバックを保つ)ために喜んでいる場合は、

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

は、おそらく妥当です妥協して(そして、元はしなかったケースを処理し、1の値が正常に返された)。

1

makeの-jパラメータは、使用するコアの数について引数を取ることができます。途中、 `NJOBS`によって

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 
+0

'grep -c^processor/proc/cpuinfo'はまったくLinux専用です。例えば、Macではまったく動作しません。 OPはまだ質問に自分のオペレーティングシステムをタグ付けするか、そうでなければ表示していません。 –

+0

しかし、シングルCPUケースを適切に処理する必要があることについての良い点があります。 –

関連する問題