2016-05-05 4 views
0

私はtest scriptがあります。実行には数時間から数日かかります。テストスクリプトは、ライブラリを繰り返しビルドし、さまざまな設定で自己テストを実行します。1つのソースファイルに対して-j設定を上書きしますか?

デスクトップおよびサーバーでは、-j Nが使用されているため、スクリプトのスピードアップが可能です(Nは使用可能なコアの数です)。テストスクリプトの実行には約2時間かかります。 LeMaker Hikey (8-core ARM64/2GB RAM)CubieTruck (8-core ARM/2GB RAM)などのDEV-ボード上

つのファイルが本当の怪物であるとOOMキルが発生するため、私は(さえN=2またはN=4用)-j Nを使用することはできません。この場合、スクリプトの実行に数日かかることがあります。

私の質問は、でこの1つのソースファイルを処理するようにGNUmakeに指示するmakeのレシピをどのように作ることができますか?それも可能ですか?

+1

複数のモジュールを使用している場合は、1つのコアのみで大きなライブラリを構築することを検討してください。 – xdevs23

答えて

1

可能かどうかわかりません。 Makeがコア間でどのように仕事を分割するかははっきりしていません。 .NOTPARALLELがターゲットとして言及されている場合は

4.9 Special Built-in Target Namesが.NOTPARALLEL

  • に言及し、その後、メイクのこの呼び出しは-jオプションが指定されている場合でも、逐次実行されます。 再帰的に呼び出されるmakeコマンドは、(メイクファイルにもこのターゲットが含まれていない限り)レシピを並列で実行します。 の前提条件はすべて無視されます。

しかし、5.7.3 Communicating Options to a Sub-makeは言う:

-jオプション(Parallel Executionを参照)特殊なケースです。 数値がNに設定され、オペレーティングシステム がサポートされていれば(ほとんどのUNIXシステムはそうですが、通常はそうでないものもあります)、 親メイクとすべてのサブメークが通信して Nジョブは、それらの間で同時に実行されます。 再帰マークされているすべてのジョブが( レシピを実行する代わりに、参照)、総雇用にはカウントされないことに注意してください(そうでない場合、我々は N実行しているサブになり、任意の実際の作業のために残さ何のスロットを持っていない得ることができます!)

オペレーティングシステムが上記の通信をサポートしていない場合は、 の値ではなく、常に -j 1がMAKEFLAGSに入れられます。これは、オプションが sub-makesに渡された場合、より多くのジョブが、 よりも多く実行されるためです。 -jに数値引数を指定しないと、 をできるだけ多くのジョブを並列で実行することを意味します。 複数の無限大は1つしかないので、これは引き継がれます。

これは私には、特定のジョブを単一のコアに割り当てる方法がないことを示しています。それはショットを与える価値がある。

+0

ありがとうございます。 '.NOTPARALLEL:regtest.cpp'を追加しようとしましたが、ビルドをシリアライズしました。 IBMは、より良い文書で[clearmake](ftp://public.dhe.ibm.com/software/rational/docs/docset/doc/cpf_4.2/ccase_ux/ccbuild/ccbuild-81.html)を持っています。しかしGNUの下では、 '.NOTPARALLEL:regtest.cpp libcryptopp.a libcryptopp.dylib libcryptopp.so'はまだビルドをシリアライズしています。 – jww

+0

@jww ['--max-load'](https://www.gnu.org/software/make/manual/html_node/Options-Summary.html#Options-Summary)スイッチを試してください。 '他のレシピが実行されていて、負荷平均が少なくとも負荷(浮動小数点数)以上であれば、新しいレシピを開始しないことを指定します。アーギュメントなしで、以前の負荷制限を取り除きます。もう一度、それは非常に曖昧ですが、その1つのレシピの負荷制限を設定できるように思われます。 –

0

大きなターゲットを最初に作成します。 その後はすべて並列に行います。

.PHONY: all 
all: 
    ⋮ 

.PHONY: all-limited-memory 
all-limited-memory: 
    ${MAKE} -j1 bigfile 
    ${MAKE} all 

予想通りだから今

  • $ make -j16 all作品。
  • $ make -j4 all-memory-limitedビルドビッグファイル(エラーの場合は終了)、残りの部分を並行して実行します。
関連する問題