62

4 つのプロセッサがあり、プロセッサを大量に消費するアプリケーションをコンパイルしています。OpenCVではスイッチを使用makeすることが推奨されていることを読みました。-j4代わりに使用する必要があります-j8か?複数のプロセッサを作成する利点は何ですか?

4

4 に答える 4

88

上記の答えはすべてほとんど正しいです。ただし、詳細は少し誤解を招く可能性があります。たとえば、「管理スレッド」用に余分なジョブを追加する必要makeはありません (注: 実際にはマルチスレッドではありません)。 makeの目的で自分自身をジョブとしてカウントすることは決してないため、Huygens が上で述べているように、 4 つと make ではなく、5 つのコンパイル ジョブが実行-jされると言った場合。-j5

ほとんどの人が [コア数] + [いくらかのパディング] を使用する理由はmake、それが必要とするものとは何の関係もありませんが、コンパイラの性質とは関係ありません。コンパイラは、実際には非常に複雑なテキスト変換ツールです。ある形式のテキストを読み取り、それを別の形式の「テキスト」(バイナリ) に変換します。これの多くは (特に C++ のように言語がより複雑になるにつれて)、大量の CPU を必要とします。ただし、多くのディスク I/O も必要です。ディスク I/O は低速で​​あるため、1 つのコンパイラがディスクからのデータを待機している間、カーネルは他のジョブの実行をスケジュールします。そのため、同時に実行するコアの数よりも多くのコンパイルを便利に実行できます。

リターンの減少が見られるようになる前に正確にどれだけ大きくできるか-j(実際には、ある時点でより多くのビルドが遅くなり始めます-j) は、ハードウェア、実行しているビルドの種類などに完全に依存します。確かに実験です。

ただし、通常は [コア数]+[少数] が適切な近似値です。

于 2013-03-08T13:26:42.503 に答える
63

あなたが言うように、-jフラグは、提供された量の「スレッド」を生成することが許可されていることをmakeに伝えます。理想的には、各スレッドが独自のコア/CPU で実行されるため、マルチコア/CPU 環境が最大限に活用されます。

makeそれ自体はソース ファイルをコンパイルしません。これは、コンパイラ (gcc) によって行われます。Makefile ( の入力make) には、一連のターゲットが含まれています。各ターゲットには、(他のターゲットに対する) 一連の依存関係と、ターゲットのビルド方法のルールがあります。makeMakefile を読み取り、すべてのターゲット、依存関係、およびビルド ルールを管理します。ソースファイルをコンパイルする以外にmake、シェルコマンドで記述できるタスクを実行するために使用できます。

スレッドの許容数を高く設定しすぎると、各スレッドを独自のコアでスケジュールすることができなくなります。すべてのスレッドを実行するには、追加のスケジューリング (コンテキスト) スイッチが必要です。この追加のリソース使用量により、明らかにパフォーマンスが低下します。

<number of cores> + 1目安はいくつかありますが、合計金額に設定するのが一番一般的だと思います。この背後にある考え方は、すべてのコアに独自のスレッドがあり、ターゲットを処理し、次にビルドされる追加の管理スレッドが 1 つあるということです。

于 2013-03-08T08:04:41.107 に答える
4

スレッドごとに 1 つの CPU と 1 つのマネージャー/ローダー。ディスク操作を行うスレッドは、CPU の観点から技術的にはほとんどアイドル状態であるため、コアの総数に 1 を追加します。

CPU がハイパースレッディングを使用している場合、各コアを 2 つのコアとして安全にカウントし、スレッド数を 2 倍にすることができます。そのため、クアッド コアの Intel Core i7 は -j9 (8 つの仮想コアとマネージャー) を取得する必要があります。クアッド コアの AMD では、-j5 を使用します。

于 2013-03-08T08:30:19.857 に答える
3

この-jオプションは、アプリケーションのビルドを高速化するためにのみ使用さmakeれ、ビルドのために生成できるジョブの数を決定します。コンパイルを並行して実行できるように、-j<nb core>またはそれ以上に設定することができます。-j<nb-core * 1.5>

コンパイルされたコードには影響しません。

4 コア システムの場合は、 を試すことができますmake -j6。make が並列ビルドを実行できる場合、最大 6 つの同時コンパイル プロセス (gcc への 6 つの呼び出しなど) を起動します。

于 2013-03-08T08:01:36.800 に答える