誰にも見えないブログ

雑なメモ。まとまってない文章等

cmake経由でmake実行時に-jオプションを渡す(未解決)→makeからninjaに乗る変える回

いい加減な理解で使ってるcmakeとの戦い。

10コアとかあるPCや100コア越えるメニーコアサーバー上で-jオプション使わずにビルドするとめちゃくちゃ遅い。cmake経由でmakeを実行するときは実行時引数か何かでしていするのかかと思いきや、できないっぽい。(追記あり。できるようです)代わりにMAKEFLAGSっていう環境変数で渡すらしい

MAKEFLAGS

export MAKEFLAGS=-j$(nproc)

stackoverflow.com

しかしこれmake4.1で使えなくなったらしい。

Won't work with Make 4.1. Just try it.

ベストアンサー見るとmakeを並列で動かす(jオプション付きの)スクリプトを書いてCMAKE_MAKE_PROGRAMに設定して動かせと書いてある。うううめんどくさい。

ちょっと気になって色々調べてたらこんな記事が

qiita.com

これninja使わなくてもCMake3.9以降なら早くなるって内容かと思ったら、ninja前提だな

CMake-3.9+Ninja では以下のように並列化されます。

うーんMake諦めてninja使うかなぁ。

ninja

qiita.com

Makeだと少なくとも10分以上掛かっていたのがNinjaでは1分強だったので、これだけスピードが違うともうMakeを使う理由がないですね。特に大きなライブラリをビルドするとき顕著に差が出ると感じています。

うーんこの記事だと並列かしてる・してないから遅いのか、それともninjaにすれば無条件で早くなるのかよくわからない。 動かしたサーバーと叩いたコマンドmake,ninja双方書いてほしいなぁ。

個人的な経験だと、makeでもハイパースレッドで224並列行けるサーバーでopencvビルドしたときはすぐ終わってびっくりした。

結局ninja

結局ninjaに乗り換えた。12コアのCPUコア全部使えてるっぽいしビルドもおおよそ体感12倍位早く終わった

  • make
cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/ 
 /usr/bin/time  sudo cmake --build . --target install
  • ninja
cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/ -GNinja
sudo cmake --build . --target install

makeしてるときはdstatでパフォーマンス見るとずっとこんな感じ。まぁ12コアCPUの1コアしかフルに動いてないから8~9%程度をウロウロしてる

----system---- -most-expensive- --total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system-->
     time     |  cpu process   |usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw >
11-11 17:47:47|cc1plus      8.3|  9   1  90   0   0|   0     0 |1440B  132B|   0     0 |1508  6344 >
  • makeのtime結果
time result
 - cmd:sudo cmake --build . --target install
 - real 1072.58s
 - user 1014.83s 
 - sys 55.17s 
 - memory:1703036KB 
 - cpu 99%
  • ninjaでbuild中はcpuをほぼ100%使い切ってる
----system---- -most-expensive- --total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system-->
     time     |  cpu process   |usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw >
11-11 17:52:42|cc1plus      8.1| 94   6   0   0   0|   0  5440k| 336B  376B|   0     0 |3712  2971 >
  • ninjaのtime結果
time result
 - cmd:sudo cmake --build . --target install
 - real 169.91s
 - user 1613.12s 
 - sys 51.60s 
 - memory:1176548KB 
 - cpu 979%

うーん10倍は早くなってないね。6倍くらいだね。ninjaそのもののオーバーヘッドがなにかあるのかな。

ちなみにビルドしてるプログラムはopenMVGという3d作成ツールです

github.com

ark.intel.com

cpuinfoとか確認してかってに12コアだと思ってたけど実際は6コアでハイパースレディングになってたのか。

追記

ブコメでosamu0329さんに教えてもらったURLの方法でmakeでも並列実行することが出来ました。

cmake経由でmake実行時に-jオプションを渡す(未解決)→makeからninjaに乗る変える回 - 誰にも見えないブログ

buildモードに-jオプションで動いたりしないんだろうか。 <a href="https://stackoverflow.com/questions/36633074/set-the-number-of-threads-in-a-cmake-build" target="_blank" rel="noopener nofollow">https://stackoverflow.com/questions/36633074/set-the-number-of-threads-in-a-cmake-build</a>

2019/11/11 21:01
b.hatena.ne.jp

buildモードに-jオプションで動いたりしないんだろうか。 https://stackoverflow.com/questions/36633074/set-the-number-of-threads-in-a-cmake-build

cmakeでは--の後につけたオプションなどがそのままビルドツール側に渡るそうです。

You can pass arbitrary arguments to the native build tool with --. Everything after -- will be passed to the build tool. To pass -j 3 in your example, just use
cmake --build . --config Release -- -j 3

stackoverflow.com

----system---- -most-expensive- --total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system-- ------memory-usage-----
     time     |  cpu process   |usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw | used  free  buff  cach
11-11 21:17:49|cc1plus      8.4| 95   5   0   0   0|   0  1224k| 189B   66B|   0     0 |8798  9750 |9491M 47.5G  467M 5586M
  • time結果
time result
 - cmd:sudo cmake --build . --target install -- -j12
 - real 162.40s
 - user 1542.56s 
 - sys 51.96s 
 - memory:1176488KB 
 - cpu 981%