昨日はコンパイルしようとしました。根ソースのパッケージ。 6コアモンスターマシンでコンパイルしていたので使い続けることにしましたmake -j 6
。最初はコンパイルがスムーズで非常に高速でしたが、ある時点でmake
1つのコアで100%CPUを使用すると中断されました。
Googleを少し探していました。これROOT掲示板に投稿してください。このコンピュータを自分で作ってみると、ヒートシンクを正しく取り付けずにCPUが過熱するなどの心配があります。残念ながら、私が働く場所に入れることができる冷蔵庫はありません。 ;-)
パッケージをインストールlm-sensors
してmake -j 6
再実行しましたが、今回はCPU温度を監視しました。温度は非常に高いですが(ほぼ60℃)、決して高い温度や臨界温度を超えません。
私はrunningを試しましたが、make -j 4
コンパイル中のある時点でmake
今回は別の場所で再び停止しました。
最後に、これをコンパイルして実行しましたが、make
うまくいきました。私の質問は:なぜ停止しますか? 2つの異なる場所で停止するため、競合状態の種類があると思いますが、make
提供されているオプションを考慮すると、すべてを正しい順序でインポートするのに十分スマートでなければならないと思いました-j
。
ベストアンサー1
この正確な質問に対する答えはありませんが、何が起こるのかについてのヒントを提供できます。 Makefileに依存関係がありません。
例:
target: a.bytecode b.bytecode
link a.bytecode b.bytecode -o target
a.bytecode: a.source
compile a.source -o a.bytecode
b.bytecode: b.source
compile b.source a.bytecode -o a.bytecode
呼び出すと、make target
すべてが正しくコンパイルされます。a.source
コンパイルは最初に実行されます(任意ですが決定論的に)。その後、b.source
コンパイルします。
ただし、make -j2 target
両方のcompile
コマンドが同時に実行される場合。実際、Makefileの依存関係が破損していることがわかります。 2番目のコンパイルではコンパイルさa.bytecode
れたと仮定しますが、依存関係には表示されません。したがって、エラーが発生する可能性が高いです。正しい依存関係行は次b.bytecode
のようになります。
b.bytecode: b.source a.bytecode
質問に戻って、運が悪いと、依存関係がないため、命令が100%CPUループで中断される可能性があります。これがおそらくここで起こっていることでしょう。順次ビルドでは欠落している依存関係を明らかにすることはできませんでしたが、並列ビルドではすでにこれを明らかにしました。