2018年12月20日 星期四

隨筆兩篇 - Clang++ vs g++ 速度;Verilator 使用簡易心得

最近在使用 Verilator 這個 tool
這是一個可以把可合成 RTL 轉換成 C++ 然後跑 RTL-sim 的開源工具
verilator 產生出來的 code 動輒數十萬行 C++,compile time 數分鐘
中型的 RTL-sim 也是在秒~分鐘上下
於是就想說以此為 benchmark
比較用不同的 C++ compiler 的本身性能以及產出的 code 的速度

測試環境如下
g++ 8.2.1
clang++ 6.0.1
clang++ 6.0.0 (in ubuntu 16.04 docker)
verilator 3.924
cpu E5-2620
kernel 4.18.5

verilator 既然作為 RTL-sim tool,當然要跟商業的 ncverilog
我用的是 ncverilog 15.20 比較
使用為 benchmark 的 RTL 是我自己的 project

首先先來比較 compile time
除了特別註明之外都是 -O2
g++ 8.2.1 (arch): 261s
g++ 8.2.1 (arch; -O1): 134sclang++ 6.0.1 (arch): 235s
clang++ 6.0.0 (docker ubuntu 16.04; arch host): 103s

可以看到 clang 的速度在 O2 時明顯比較快
在 ubuntu 16.04 的因為 verilator 版本比較舊的關係
產生出來的 code 似乎 compile time 少很多

接著比較 RTL-sim 速度
拿了七個 testbench 來比較的速度結果如下(不 dump waveform)
g++/clang++/g++ -O1
 1.4/ 1.3/   1.3
 1.9/ 2.0
 141150/   127
  85/  82
0.23/0.23
0.41/0.40
0.22/0.18
  41/  35
總體而言 clang 產生的 code 稍微快一點,但是沒有很明顯
而且可能因為 code gen 出來的 code 形狀跟一般手寫的程式有差別
O2 花了更多時間反而產生了負面作用

那麼加上商用的 ncverilog 比看看呢?
g++/clang++/ncverilog
 1.4/ 1.3/ 1.4
 1.9/ 2.0/ 2.3
 141150/ 203
  85/  82/ 105
0.23/0.23/0.27
0.41/0.40/0.53
0.22/0.18/0.16
  41/  35/  63
基本上 runtime 是 verilator 全面勝利
但是 ncverilog 的 compile time < 10 秒

結論

這個實驗並不完全精準
畢竟在 server 跑,而且沒有控制 server 的 load
不過看來 g++ vs clang++ 應該後者是贏一點的

其二是 RTL-sim tool 的比較
這個數字看來,付給 cadence 這麼多錢算是有價值的
畢竟作為一個完整的 system verilog simulator 可以有這種速度
而且 compile time 遠快過 verilator

而 verilator 可以達到較快的 simulation speed
加上支援 system verilog 標準
如果模擬拉長會非常有優勢,是個優秀的軟體
又因為 open-source,可以容易整合網路上現有的 CI 工具
蠻推薦在個人 project 使用的

然而 verilator 配合 gtkwave 作為 debug 使用還有許多問題
例如說目前 waveform dump 只支援 vcd
(PS 4.00x 的時候我打了一個 patch 上去可以支援 lxt2,後來就有人順手加了 fst 格式)
然後目前產生出來的 I/O, array type 全部會被打散成單一的 wire,很不方便
(issue 好像有人說要解這個問題?)

另外,值得注意的是,根據前面的數據
使用 verilator compile 的時候最好把 -O1, -O2 等等不同編譯選項都嘗試一下

沒有留言:

張貼留言