マルチコアでコンパイルするときにmakeがクラッシュする原因は何ですか?

マルチコアでコンパイルするときにmakeがクラッシュする原因は何ですか?

昨日はコンパイルしようとしました。ソースのパッケージ。 6コアモンスターマシンでコンパイルしていたので使い続けることにしましたmake -j 6。最初はコンパイルがスムーズで非常に高速でしたが、ある時点でmake1つのコアで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ループで中断される可能性があります。これがおそらくここで起こっていることでしょう。順次ビルドでは欠落している依存関係を明らかにすることはできませんでしたが、並列ビルドではすでにこれを明らかにしました。

おすすめ記事