18

Windows で GNU 並列ジョブ (-j) を作成するには、どのようなセットアップが機能しますか?

MinGW make 3.81 を使用してシェルを cmd.exe に設定しようとしましたが、これは複数のプロセスを作成する際に機能しますが、make は「ジョブを待っています」というメッセージで失敗します。

これは機能しますか?最適なセットアップは何ですか? (MinGW / Cygwin / ???) 誰かがテストする実際の例を教えてもらえますか?

4

5 に答える 5

4

As Far as I can understand, GNU Make's parallel jobs depend on the underlying platform to supply (CPU) load information. This is unfortunately done in a non-Windows-compatible way, and only the "make -j" command does anything scalingwise. That command (without max number of jobs) is potentially quite dangerous, as it will eat memory like a rabid starving dog (I tried it on Qt, and it crashed on QtWebkit, the largest project in Qt, 4GB RAM, Win7).

On second thought, I get the feeling make -j3 runs faster than make, but in light of what I can find on the web (forums, manual...) it seems very POSIX/linux specific functionality.

BTW, I'm surprised your question was voted down.

于 2010-05-24T16:20:02.263 に答える
4

CMake ユーザーに役立つヒント

cmake-makefiles が通常行うように、makefile が make を再帰的に呼び出す場合、-jN オプションは機能しません。しかし、生成されたメイクファイルで CMake がそのような構文を介して呼び出すため、再び機能する解決策があります。

$(MAKE) -f CMakeFiles\Makefile2 <subproject>

これは、変数 MAKE を変更できることを意味します。

mingw32-make "MAKE=mingw32-make -j3"

これで、subproject-make が開始されるたびに、再び「-j3」オプションが取得されます。ただし、これにより、並列コンパイルの数が事実上 3 に制限されるわけではないことに注意してください。同じ階層に互いに依存しない 3 つ以上のプロジェクトがある場合、3 つのプロジェクトすべてが並行してビルドされ、それぞれが 3 つのコンパイル ステップを開始します。その結果、9 つの並列コンパイル ステップが発生します。

cmake によって生成された最上位の Makefile をもう一度詳しく調べると、ターゲット "all" が基本的にサブ make のみを開始することがわかります。

$(MAKE) -f CMakeFiles\Makefile2 all

したがって、サブプロジェクトの並列処理の 1 つのレイヤーを削除するには、次の呼び出しを行います。

mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all

しかし、これは進捗レポートを犠牲にします。

それにもかかわらず、これが役立つことを願っています。

于 2013-01-09T14:05:13.913 に答える
3

Windows での並列 make ビルドの問題を説明しているDanny Thorpe のブログ エントリを見つけました。基本的に、最初に次の環境変数を設定することをお勧めします。

set SHELL=cmd.exe

これで、スタイル コマンドを実行できましたmake -jが、残念ながら制御されたスタイル コマンドは実行できませんでしたmake -jN

于 2011-02-04T12:47:15.823 に答える
3

この問題を解決したので、解決策をみんなに共有します。

MinGW-TDM (ホーム ページ: http://tdm-gcc.tdragon.net/ ) または MinGW-Equation (ダウンロード ページ: http://www.equation.com/servlet/equation.cmd?fa=fortran ) を試すことができます。 )。

たとえば、 32 ビット バージョンをインストールしますD:\MinGW\MinGW32 (64 ビット コンパイル バイナリを使用する場合は、64 ビット バージョンを D:\MinGW\MinGW64 にインストールします)。

次のようにバッチ ファイルを作成し、ビルド ディレクトリで実行します。

Set MinGW_bin=D:\MinGW\MinGW32\bin
Set MSys_bin=D:\MinGW\msys\bin
Set Path=%MSys_bin%;%MinGW_bin%
mingw32-make SHELL=CMD.exe -j6 -f makefile

MSYS はhttp://sourceforge.net/apps/trac/mingw-w64/wiki/MSYSからダウンロードできます。多くのオープン ソース ライブラリ、アプリケーションを構築する必要がある多くの UNIX のようなユーティリティがあります。

-j6 は、6 つの並列コンパイル ジョブを実行するオプションです。

ヒント: オプション -jN を設定できます。ここで、N は CPU コア (スレッド) の数の 1.5 倍です。私の場合、CPU には 4 つのスレッドがあるため、この値を 6 に設定します。

注:実行できます

make.exe -jN -f メイクファイル

オプションなし SHELL=CMD.exeで、コンパイルは並行して実行されますが、場合によっては互換性がありません ( make.exeMSYS ディレクトリからのもの)。

よろしく、

于 2012-08-05T03:17:15.173 に答える
2

make -jnCygwin で問題が発生したことはありません。それはかなりうまく機能します。私は定期的に Microsoft のcl.exeコンパイラで使用しています。それは私にとって箱から出してすぐに機能します。非常に UNIX に似ており、Good Thing™ です。ビルド スクリプトは、Linux および Mac に適切に移植されます。徹底的にお勧めします。

バックスラッシュが 5 つでは少なすぎて 6 つでは多すぎる場所にたどり着いて以来、MinGW の作成は好きではありませんでした。はぁ!(バックスラッシュで区切られたパス名をmake AFAIKで許可するようにするためのMinGWハックを行うため。)

于 2011-02-07T17:31:41.920 に答える