web-dev-qa-db-ja.com

使用するmakeスレッドはいくつありますか?

デスクトップ/ラップトップコンピューターで大規模なシステムを(再)ビルドするとき、次のようにmakeに複数のスレッドを使用してコンパイル速度を上げるように指示します。

$ make -j$[ $K * $C ]

どこ $Cは、マシンのコア(1桁の数字であると想定できます)の数を示しますが、$Kは私とは異なるものです2から4、気分に応じて。

したがって、たとえば、make -j12 4つのコアがある場合、makeに最大12のスレッドを使用するように指示します。


私の論理的根拠は、もし私が$Cスレッド、コアがアイドル状態になり、プロセスがドライブからのデータのフェッチでビジーになります。しかし、スレッドの数を制限しない場合(つまり、make -j)コンテキストを切り替える時間を浪費するリスクを負い、メモリが不足します またはそれより悪い 。マシンに$Mメモリのギグ(ここで$Mは10のオーダーです。

したがって、実行するスレッドの最も効率的な数を選択するための確立された戦略があるかどうか疑問に思っていました。

11
bitmask

2つのコアと8 GBのRAMを搭載したマシンでllvmを(デバッグ+アサートモードで)ビルドして、一連のテストを実行しました。

compiling llvm time depending on number of jobs

奇妙なことに、それは10まで上昇したように見え、その後、2つのジョブで構築するのにかかる時間を突然下回ります(1つのジョブは約2倍の時間がかかりますが、グラフには含まれていません)。

この場合、最小値は7*$coresのようです。

15
bitmask

私はGentoo Linux(ソースベースのディストリビューション)を実行しており、私の経験から(多かれ少なかれ最近のハードウェアで)n*2 + xが最良の値です。これについて説明しましょう:

  • n*2:より遅いCPUでも、一度に2つのタスクを実行するのに十分な能力があります。ほとんどのコンパイルタスクは非常に速く完了します。
  • +xこの数は、システム(主にメモリとディスク)によって異なります。十分なRAMと高速ディスクがある場合は、x=n。ただし、これはソースコード(Open Office、私が見ている!)と使用する言語(C/C++のコンパイルはメモリを大量に消費する)によって異なります。

ただし、いくつかのテストをいくつかの-j値を使用して、最適な数を取得します。また、ビルドプロセスの他のステップ(アンパック、configureの実行など)を並列化してみてください。

3
ercpe