2010-11-28

jom: 並列nmake

jomというQtの作っているビルドツールを見つけた。

Visual C++付属のmakeであるnmakeのクローンらしい。違いはマルチコア用に並列ビルドができること。バイナリが単独で公開されているので最近利用している。

gmakeは-j 5とすると5プロセスで並列でビルドを走らせてくれるが、nmakeは未だにそのサポートがない。cl /MP a.c b.cというオプションで並行でコンパイルはしてくれるが、makeを使う場合ソースファイルはひとつずつしか処理されないので、このオプションは使えない。

  • MSVCでプログラムを作っているのに
  • Visual Studioではなくnmakeを使っていて
  • nmake用のMakefileを捨てたくないが
  • コンパイル速度を上げたい

というかなりニッチな需要を満たしてくれる。(というか、本来はQtユーザ用なのだと思う)

ベンチマーク

手元の自作ゲームを一からビルドする時間を計ってみた。3GHzのCore 2 Duoで試した。

『体力制チェス』 (総計9461行、53ヘッダ+47ソース=100ファイル)

--nmakejom
プリコンパイルヘッダなし25.2 秒14.23 秒
プリコンパイルヘッダあり5.0 秒3.6 秒

『加速度センサー小品集』 (総計10067行、51ヘッダ+57ソース=108ファイル)

--nmakejom
プリコンパイルヘッダなし33.6 秒18.5 秒
プリコンパイルヘッダあり7.2 秒4.9 秒

それなりに効果はあるようだ。(ディスクキャッシュの話があるので細かい数字は信用できないが)

移行

クローンとはいえ、既存のMakefileを全くそのまま使えたわけではない。

依存関係を見て並列的に処理できるところを分けるので、依存関係をきちんと設定していないと順不同になるところが出てくる。最初に試したときはmkdirが偶然うまくいっていた所がつまづいた。

Makefile内でINCLUDE環境変数を書き換えてインクルードパスを無理やり設定していたが、その方法が通じなかった。CFLAGSに直接追加することで解決した。INCLUDEをMakefile内で設定してもコンパイラに伝わらないようだ。

下位互換性はあるので、とりあえず仲間内では自分だけ使おうと思っている。

Nov 28th, 2010 11:10pm
(copied from tumblr)