Verilator のコンパイルを速くしたい
実行速度は爆速の Verilator ですが、ソースの規模が大きくなってくるとコンパイル時間が長くなってきます。
こちらで、Clang使うと少し早くなると紹介されていたのですが、なかなか手を出せずにいたところ cmake で使う方法を、こちらで見かけたのでやってみました。
Clang を使ってみる
Ubuntu の場合ですが、clang が入っていなければこんな感じで入ると思います。
sudo apt update sudo apt install clang
先例に倣って clang-cmakeinit.cmake というファイルを作ってみました(ファイル名は何でもいいのかな?)。
set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE string "clang compiler" FORCE) set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE string "clang++ compiler" FORCE)
従来
mkdir -p build && cd build && cmake ..
としていたのですが、
mkdir -p build && cd build && cmake -C ../clang-cmakeinit.cmake ..
とすればよいようです。
ついでに Ninja も試してみる
インストールはこんな感じのようです。
sudo apt install ninja-build
先の例がこうなります。
mkdir -p build && cd build && cmake -GNinja -C ../clang-cmakeinit.cmake ..
計ってみました
Windows10 の WSL2 に Ubuntu 20.04 を入れている環境ですが、time コマンドでこちらのビルド時間を測ってみました。
オリジナルの gcc 環境
real 0m32.254s user 0m20.771s sys 0m4.748s
Clan にした場合
real 0m29.899s user 0m17.881s sys 0m4.267s
おお、速くなった。
Clan + Ninjaにした場合
real 0m20.849s user 0m17.695s sys 0m2.891s
おお、これも効いた。
結論
環境や対象によると思いますが、結構変わるかもしれません。 ディスクキャッシュとかそういう状況次第でも変動しそうです。
少し後から clean と build を繰り返してみましたが、どうやらそれなりの改善効果はあるようです。
ちょっとでも速い方が嬉しいですよね。いろいろ試してみる価値はあるのかなと。
追記
Verilator の sample にならって、cmake を Makefile から呼び出して使ってますが、結局 clang や ninjya があるときだけ使う用に、こんな感じに落ち着きました。Makefile は Makefile で便利ですね。
# cmake のフラグ CMAKE_FLAGS = # clang があれば使う ifeq (,$(shell which clang)) WITH_CLANG ?= No else WITH_CLANG ?= Yes endif # ninja があれば使う ifeq (,$(shell which ninja)) WITH_NINJA ?= No else WITH_NINJA ?= Yes endif ifeq ($(WITH_CLANG),Yes) CMAKE_FLAGS += -C ../clang-cmakeinit.cmake endif ifeq ($(WITH_NINJA),Yes) CMAKE_FLAGS += -GNinja endif all: build run coverage .PHONY : build build: mkdir -p build && cd build && cmake $(CMAKE_FLAGS) .. cmake --build build -j .PHONY : clean clean: rm -rf build