web-dev-qa-db-ja.com

QTCreator内のmingwを使用して複数のコアでコンパイルする方法

Windowsデスクトップにクアッドコアi7 CPUを搭載しています。可能な限り多くのコアを使用してmingw32-makeをコンパイルしようとしています。 [ビルド設定]-> [ビルドステップ]の[引数の作成]フィールドに-j8を追加しました。 mingw32-makeはこのオプションを完全に無視しているように見えます。それによって速度が向上しないためです。タスクマネージャーでCPU使用率を表示すると、CPU使用率は13%のままで、g ++のインスタンスが1つだけ実行されているのがわかります。

現在、mingwを使用してプロジェクト全体を再構築するには、3分かかります。 MSVCを使用した再構築には15秒しかかかりません。

参考までに、プロジェクト設定でプリコンパイル済みヘッダーオプションを有効にしました。 VCの場合も同様ですが、mingwを使用したプリコンパイル済みヘッダーの利点はまだわかりません。

QTCreatorから複数のソースファイルを並行してコンパイルするmingwがある場合は、コメントを共有してください。ありがとう!

22
Stephen Cheng

これが私がしたことです。

Qt Creatorの[ツール]→[オプション]メニューの[ビルドと実行]セクションに、「nmakeではなくjomを使用する」というオプションがあります。そのボックスをチェックしましたが、何も変わりませんでした。代わりに、プロジェクトのビルド設定に移動し、ビルドステップカテゴリの下に「作成」アイテムがあります。その詳細を展開すると、「オーバーライドmingw32-make.exe:」という項目が見つかります。そこに「C:\ QtSDK\QtCreator\bin\jom.exe」を貼り付けたところ、突然複数のコアでビルドされていました。

Qt Creator 2.4.1で動作しました。試してみる。

22
kenrogers

-j8は、GNU Win32でのMakeの制限により、おそらく機能していません。

引数の作成フィールドに-jだけを入力してみてください。これは、Makeにできるだけ多くのコンパイルプロセスを生成するように指示します。RAMとそれを処理するためのCPUが十分にある場合は、1回のコンパイルよりも高速です。

残念ながら、これらは(Makefileを変更しない)2つのオプションのみです:-j1または無制限-j

詳細:GNU Win32のMakeはジョブサーバーをサポートしていないため、親のMakeプロセスは、サブMakeによって生成されたコンパイルプロセスの数を追跡できません。安全のために、 sub-Makeは-j1でのみ実行されます。qmake/ Qt Creatorで生成されたMakefileは複数のレイヤーのMakefileを使用していると思います。まずMicrochipのMPLAB X IDEでこの問題を見つけました、チェックアウト this thread forより詳しい情報

この引用は、GNU Makeとともに配布されるREADME.W32からのものです。

並列ビルドのサポート

このポートでは、並列ビルド(-jN)がサポートされていますが、次の2つの制限があります。

  • このポートがサブプロセスの待機を実装する方法により、並行プロセスの数には64のハード制限があります。

  • ジョブサーバーメソッド(MakeがPosixプラットフォームで実行されている場合に使用可能)はサポートされていません。つまり、再帰的なMakefileでサブMakeに明示的な-jNスイッチを渡す必要があります。サブMakeが明示的な-jNスイッチを受信しない場合、デフォルトで-j1になります。つまり、サブMakeに並列処理はありません。

11
Brendan Shanks

_-j9_(_9_を_NUMBER_OF_PROCESSORS_(Windows)/ $(nproc)(Linux)+ 1の値に置き換えます—これが最適です)をすべてに追加します

_QString makefilein = " -f " + subtarget->makefile;
_

qmake\generators\makefile.cppの行(自分で確認)。

結果として

_QString makefilein = " -j9 -f " + subtarget->makefile;
_

次に、適切なパラメータを指定して_configure.exe_を実行します(!および豊富なメイクファイルの生成を回避するために、追加の_-qmake -dont-process_を使用します!)。

問題は、「デバッグおよびリリース」ビルド中に2セットのプロセスを取得することです。これにより、生成されたプロセスの総数は18以上になります。

4

使用する MAKE_COMMAND環境変数:

set MAKE_COMMAND=mingw32-make -j%NUMBER_OF_PROCESSORS%
3
Stephen Chu

Qt Creatorで、[プロジェクト]-> [ビルドと実行]->特定のMinGWビルドセットアップ->ビルド環境(これは、[一般]/[ビルドステップ]/[クリーンステップ]の下の画面にあります)に移動し、変数MAKEFLAGSを追加します。 -j8に設定します。 -j4とQtCreator 4.4.1、およびMinGW 5.3.0を使用して、2つのコアマシンでこれをテストしました。タスクマネージャーで確認できるように、私のプロセッサーをコンパイルすると100%のパフォーマンスで実行されます。このオプションがないと約25%だったので、期待どおりに機能すると思います。ビルドがはるかに高速になりました。

1
V.K.

-jを使用する方法ですが、残念ながら、プロジェクトが非常に大きく、使用可能なメモリがすべて消費され、コンピューターがフリーズするので、注意してください。ブレンダン氏は、たとえば、コアの半分だけを使用する方法はないので、本当だとしたら残念だと語った。

0
user1274616

問題は、元のmakeがjobserverをサポートしていないことです。したがって、mingw32ポートにもそれはありませんでした。ただし、追加されています。 「正しい」jobserverをサポートする最も古いバージョンは3.82.90だと思います。あなたは以下のリンクでそれを見つけることができます。

http://sourceforge.net/projects/mingw/files/MinGW/Extension/make/make-3.82.90-cvs-20120823/

0
inetknght