前回の記事で gem5 のビルドで幾つか問題が発生しました.
今回は,それらを順番に解決していこうと思います.
プロトコルバッファパッケージの追加
一つ目は以下の警告メッセージです:
Warning: Protocol buffer compiler (protoc) not found.
Please install protobuf-compiler for tracing support.
Ubuntu Bionic の Protocol Buffer パッケージは
ここ
に詳細が記載されている通り,幾つかの関連パッケージが存在します.
今回はとりあえず以下を入れてみました.
$ sudo apt install protobuf-compiler libprotoc-dev libprotobuf-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libprotoc10
以下のパッケージが新たにインストールされます:
libprotobuf-dev libprotoc-dev libprotoc10 protobuf-compiler
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 0 個。
2,231 kB のアーカイブを取得する必要があります。
この操作後に追加で 15.8 MB のディスク容量が消費されます。
続行しますか? [Y/n]
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libprotoc10 amd64 3.0.0-9.1ubuntu1 [566 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libprotobuf-dev amd64 3.0.0-9.1ubuntu1 [959 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libprotoc-dev amd64 3.0.0-9.1ubuntu1 [682 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu bionic/universe amd64 protobuf-compiler amd64 3.0.0-9.1ubuntu1 [24.5 kB]
2,231 kB を 5秒 で取得しました (432 kB/s)
以前に未選択のパッケージ libprotoc10:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 575503 個のファイルとディレクトリがインストールされています。)
.../libprotoc10_3.0.0-9.1ubuntu1_amd64.deb を展開する準備をしています ...
libprotoc10:amd64 (3.0.0-9.1ubuntu1) を展開しています...
以前に未選択のパッケージ libprotobuf-dev:amd64 を選択しています。
.../libprotobuf-dev_3.0.0-9.1ubuntu1_amd64.deb を展開する準備をしています ...
libprotobuf-dev:amd64 (3.0.0-9.1ubuntu1) を展開しています...
以前に未選択のパッケージ libprotoc-dev:amd64 を選択しています。
.../libprotoc-dev_3.0.0-9.1ubuntu1_amd64.deb を展開する準備をしています ...
libprotoc-dev:amd64 (3.0.0-9.1ubuntu1) を展開しています...
以前に未選択のパッケージ protobuf-compiler を選択しています。
.../protobuf-compiler_3.0.0-9.1ubuntu1_amd64.deb を展開する準備をしています ...
protobuf-compiler (3.0.0-9.1ubuntu1) を展開しています...
libprotobuf-dev:amd64 (3.0.0-9.1ubuntu1) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
libprotoc10:amd64 (3.0.0-9.1ubuntu1) を設定しています ...
protobuf-compiler (3.0.0-9.1ubuntu1) を設定しています ...
libprotoc-dev:amd64 (3.0.0-9.1ubuntu1) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
tcmallocライブラリのインストール(libgoogle-perftools-dev)
ビルド途中で以下のメッセージが出ています:
You can get a 12% performance improvement by installing tcmalloc (libgoogle-perftools-dev package on Ubuntu or RedHat).
エラーや警告ではなく Suggest ですが,google-perftools の tcmalloc を使うと性能が12%は向上するとのことです.
試しに入れてみたいと思います.導入はメッセージ通りに以下で行います.
$ sudo apt install libgoogle-perftools-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libgoogle-perftools4 liblzma-dev libtcmalloc-minimal4 libunwind-dev
提案パッケージ:
liblzma-doc
以下のパッケージが新たにインストールされます:
libgoogle-perftools-dev libgoogle-perftools4 liblzma-dev
libtcmalloc-minimal4 libunwind-dev
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
1,053 kB のアーカイブを取得する必要があります。
この操作後に追加で 8,826 kB のディスク容量が消費されます。
続行しますか? [Y/n]
取得:1 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libtcmalloc-minimal4 amd64 2.5-2.2ubuntu3 [91.6 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libgoogle-perftools4 amd64 2.5-2.2ubuntu3 [190 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 liblzma-dev amd64 5.2.2-1.3 [145 kB]
取得:4 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libunwind-dev amd64 1.2.1-8 [423 kB]
取得:5 http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 libgoogle-perftools-dev amd64 2.5-2.2ubuntu3 [204 kB]
1,053 kB を 10秒 で取得しました (102 kB/s)
以前に未選択のパッケージ libtcmalloc-minimal4 を選択しています。
(データベースを読み込んでいます ... 現在 575702 個のファイルとディレクトリがインストールされています。)
.../libtcmalloc-minimal4_2.5-2.2ubuntu3_amd64.deb を展開する準備をしています ...
libtcmalloc-minimal4 (2.5-2.2ubuntu3) を展開しています...
以前に未選択のパッケージ libgoogle-perftools4 を選択しています。
.../libgoogle-perftools4_2.5-2.2ubuntu3_amd64.deb を展開する準備をしています ...
libgoogle-perftools4 (2.5-2.2ubuntu3) を展開しています...
以前に未選択のパッケージ liblzma-dev:amd64 を選択しています。
.../liblzma-dev_5.2.2-1.3_amd64.deb を展開する準備をしています ...
liblzma-dev:amd64 (5.2.2-1.3) を展開しています...
以前に未選択のパッケージ libunwind-dev:amd64 を選択しています。
.../libunwind-dev_1.2.1-8_amd64.deb を展開する準備をしています ...
libunwind-dev:amd64 (1.2.1-8) を展開しています...
以前に未選択のパッケージ libgoogle-perftools-dev を選択しています。
.../libgoogle-perftools-dev_2.5-2.2ubuntu3_amd64.deb を展開する準備をしています ...
libgoogle-perftools-dev (2.5-2.2ubuntu3) を展開しています...
libtcmalloc-minimal4 (2.5-2.2ubuntu3) を設定しています ...
libgoogle-perftools4 (2.5-2.2ubuntu3) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
liblzma-dev:amd64 (5.2.2-1.3) を設定しています ...
libunwind-dev:amd64 (1.2.1-8) を設定しています ...
libgoogle-perftools-dev (2.5-2.2ubuntu3) を設定しています ...
なお google perftools は
このGitHubサイト
がメインメージのようです.説明には以下とかかれています.
gperftools
----------
(originally Google Performance Tools)
The fastest malloc we’ve seen; works particularly well with threads
and STL. Also: thread-friendly heap-checker, heap-profiler, and
cpu-profiler.
なお tcmalloc をインストール後に再ビルドをかける場合には,
build フォルダを削除 (rm -r build)する必要があるみたいです.
僕の再ビルドした際にやはり見つからないという状況が発生しました.
この記事によると
キャッシュされたコンフィグレーションを削除
する必要があるみたいですね.
C++でのコンパイルエラー
今回のコンパイルを失敗させている要因は以下のコンパイルエラーです:
build/ARM/arch/arm/generated/exec-ns.cc.inc:220634:39: error: '~' on an expression of type bool [-Werror=bool-operation]
destElem = srcElem1 & ~srcElem2;
^~~~~~~~~
build/ARM/arch/arm/generated/exec-ns.cc.inc:220634:39: note: did you mean to use logical not ('!')?
cc1plus: all warnings being treated as errors
なお使用しているコンパイラは gcc で,バージョンは以下です:
$ gcc --version
gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
エラーが発生している exec-ns.cc.inc ファイルは以下のログ表示で示されている通りに
main.isaから自動生成されたファイルであり,
その行数は250000行程度あります.ファイルが大きいこと,また自動生成されているということもあり,
今後のupdateやrebuildのことを考えると,このファイルを修正することは適切ではないと考えられます.
[ISA DESC] ARM/arch/arm/isa/main.isa -> generated/decoder-g.cc.inc, generated/decoder-ns.cc.inc, generated/decode-method.cc.inc, generated/decoder.hh, generated/decoder-g.hh.inc, generated/decoder-ns.hh.inc, generated/exec-g.cc.inc, generated/exec-ns.cc.inc, generated/max_inst_regs.hh, generated/decoder.cc, generated/inst-constrs-1.cc, generated/inst-constrs-2.cc, generated/inst-constrs-3.cc, generated/generic_cpu_exec_1.cc, generated/generic_cpu_exec_2.cc, generated/generic_cpu_exec_3.cc, generated/generic_cpu_exec_4.cc, generated/generic_cpu_exec_5.cc, generated/generic_cpu_exec_6.cc
ネット上で色々と調べましたが,実は gcc7,gcc8 等で発生するコンパイルエラーには既に対応しているみたいです
(この記事等).
はて,と思いつつ,今回ソフトウェアを導入したリポジトリが良くなかったのかもしれません.
Mercurial でリポジトリ http://repo.gem5.org/gem5 をコピーしましたが,git のリポジトリ https://gem5.googlesource.com/public/gem5 の方が
適切なのかもしれません.git リポジトリの方が「Official git repository」と位置づけられていますし.
そのため,Mercurial のリポジトリはやめて googlesource.com の git リポジトリで試してみることにしました.
それについては次回報告します.
【補足】sconsでの並列ビルド
気づいたのですが scons は複数ジョブでの並行ビルドを行うためのオプション
-j
がある模様です.
現在ビルドを行っているマシンは
物理コアを8個ほど積んでいるマシンのため,
4並列ジョブでビルドしようと思います.
どんな感じになるか少し試してみようと,実際に再ビルドを行ってみた際のパフォーマンスモニタ画面が以下です.
4並列でジョブが動作しているのが見て取れる(負荷率がほぼ100%のコアが4つ)と思います.
次回,gitリポジトリで再構築を試みる際には並列ビルドで実施しようと思います.