10

09

複数のプロセスを使用したビルド、マルチコアを使用したビルドをやりたい

2012.10.09(21:29)

Visual Studio 2010のVisual C++では(以前から)
「複数のプロセスを使用したビルド」
がサポートされており、マルチコアCPUを使ったPCではこの機能を使って、ビルド時間を大幅に短縮することができます。

使用前
before.png
全部のコアは使われていません。

使用後
after.png
全部のコアがフルに使われて、8コアの場合、コンパイル速度はおよそ7倍になります。

ここでは
(1) Visual Studio のソリューション、プロジェクトでビルドする方法
(2) nmakeとclを使って、ビルドする方法
の2つの場合で解説します。

(1) Visual Studio のソリューション、プロジェクトでビルドする方法
/MP (複数のプロセスを使用したビルド)
http://msdn.microsoft.com/ja-jp/library/vstudio/bb385193.aspx
で説明されているとおりに設定すればOK。
プロジェクトのプロパティを開き
構成プロパティ - C/C++ - 全般 - 複数プロセッサによるコンパイル を はい(/MP)
構成プロパティ - C/C++ - コード生成 - 最小ビルドを有効にする を いいえ(/Gm-)
あとは、Visual Studioがやってくれます。

(2) nmakeとclを使って、ビルドする方法
clによってコンパイルするときに、/MPと/Gm-をつければよいのですが、

たとえば、プロセスを4つ使ってコンパイルするには、
cl /MP4 a.cpp
cl /MP4 b.cpp
cl /MP4 c.cpp
cl /MP4 d.cpp
cl /MP4 e.cpp
ではなくて、

cl /MP4 a.cpp b.cpp c.cpp d.cpp e.cpp
としてコンパイルしなければなりません。clが複数のプロセスを操るためです。

nmakeに渡すMakefileで、ファイルの依存性からどのcppをコンパイルするかを導き出したあと、それを
1つ1つclに渡していたら、それをまとめてclに渡すように変更します。

それを実現するのが、
バッチモード推論規則(Batch-Mode Inference Rules)
http://msdn.microsoft.com/ja-jp/library/vstudio/f2x0zs74.aspx
です。

cppからobjへの依存を記述する部分で、
.cpp.obj:

.cpp.obj::

コロン1つをコロン2つに書き換えるのがポイントです。

一回のコンパイルに多数のcppファイルを同時に渡してだいじょうぶかと思いましたが、nmakeの中から、262個のcppファイル名を並べ、ほかのコンパイルオプションとあわせて9073バイトの長さのコマンドラインを、一回でclに渡してコンパイルして大丈夫でした。

おまけ
こういうことがわかりました。
  • パッケージごとにコンパイルオプションが違う場合はその単位でしか/MPできない
  • パッケージの凝集度が低く、それぞれのパッケージに cppファイルが多数ある場合は、/MPによる高速化が7倍ぐらい
  • パッケージの凝集度が高く、それぞれのパッケージに cppファイルが少しずつの場合は、/MPによる高速化は4倍ぐらい
あらら。

注意
4倍、7倍というのは、私のWindows7ノートパソコン + VisualStudio 2010 Preminum + 私のソリューション、および、プロジェクトの場合です。

がっかり
組込み機器用のクロスコンパイラで、1人が1台のPCでコンパイルしているのに8コア使うと8ライセンス使っちゃうようなクロスコンパイラにはがっかり。
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示