cmake経由でmake実行時に-jオプションを渡す(未解決)→makeからninjaに乗る変える回
いい加減な理解で使ってるcmakeとの戦い。
10コアとかあるPCや100コア越えるメニーコアサーバー上で-j
オプション使わずにビルドするとめちゃくちゃ遅い。cmake経由でmakeを実行するときは実行時引数か何かでしていするのかかと思いきや、できないっぽい。(追記あり。できるようです)代わりにMAKEFLAGS
っていう環境変数で渡すらしい
MAKEFLAGS
export MAKEFLAGS=-j$(nproc)
しかしこれmake4.1で使えなくなったらしい。
Won't work with Make 4.1. Just try it.
ベストアンサー見るとmakeを並列で動かす(jオプション付きの)スクリプトを書いてCMAKE_MAKE_PROGRAM
に設定して動かせと書いてある。うううめんどくさい。
ちょっと気になって色々調べてたらこんな記事が
これninja使わなくてもCMake3.9以降なら早くなるって内容かと思ったら、ninja前提だな
CMake-3.9+Ninja では以下のように並列化されます。
うーんMake諦めてninja使うかなぁ。
ninja
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作成ツールです
cpuinfoとか確認してかってに12コアだと思ってたけど実際は6コアでハイパースレディングになってたのか。
追記
ブコメでosamu0329さんに教えてもらったURLの方法でmakeでも並列実行することが出来ました。
cmake経由でmake実行時に-jオプションを渡す(未解決)→makeからninjaに乗る変える回 - 誰にも見えないブログb.hatena.ne.jpbuildモードに-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
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
----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%