RISC-V Mentorship: Porting V8 to RISC-V R32Gに採用されなかった
RISC-V Mentorship
RISC-V Mentorship ProgramとはRISC-Vに関連した、あるプロジェクトにアサインされ、そこで12周間メンターシップを受けられるというものです。
私はこちらのV8をRISC-Vに移植するというプロジェクトに興味が湧き、他に応募者がいないので応募してみました。
application
応募に際して事前にいくつかの課題が与えられました。確か以下の3つです
- 大学の許可はあるか(書類を提出する必要はなくチェックを付けるだけで良い)
- 履歴書
- なぜこのプロジェクトを選んだのかについての文書
上2つはそのまま。最後のはコンパイラに興味がある、RISC-Vに関して深い知識を得てコミュニティに貢献をしたいみたいなことを書いた気がします。
ここは通りました。
Pre-task
次に以下のタスクが与えられました。
- Find the source code repo of V8. Build it on your machines. Run Octane/Kraken/SunSpider benchmarks using the d8l you just built.
- Try to set up the cross-toolchain for RISC-V (RV64GC) platform. You can either install it using apt/yum for clone the riscv-gnu-toolchain repo and build it yourself. Then try to cross compile the V8 to RV64GC. The bonus is to prepare a QEMU emulator which can executes RV64GC binaries.
- Please prepare a more detailed proposal. the Cover Letters I received are more like for self introductions, not for project plan. So please show your understandings and knowledge background by submitting a new proposal. Thanks.
これらのタスクを私は以下のPCで行いました。
1. Build V8 and run benchmarks
公式のドキュメントを参照しました。
まず、depot_toolsの設定をします。
ソースコードの取得
- 以下のコマンドをホームディレクトリ直下で行います
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
- 次に以下のように
depot_tools
のPATHを追加しますexport PATH=${PATH}:${HOME}/depot_tools
- 次に
.netrc
を設定する必要があります- https://chromium.googlesource.com/new-password
- こちらのサイトに
git config user.email
で使っているGアカウントでログインするとターミナルで実行するべきコードが出てきます。それを実行します
- 以上でV8のソースコードを持ってくる準備はできました。以下のコードを実行します
mkdir ~/v8 cd ~/v8 fetch v8 cd v8
- このようにすると
~/v8
以下にv8
というディレクトリが現れれ、そこにV8のソースコードがあります
- このようにすると
ビルド
- 最初に依存ソフトをダウンロードしておきます
gclient sync
- Linuxを使っている場合は、追加の依存ソフトのインストールが必要です
./build/install-build-deps.sh
-
main
ブランチにいることを確認して、最新版に変更していることを確認して、再度依存ソフトをインストールしますgit switch main
git pull && gclient sync
- そして、以下のコードでコンパイルすることができます
tools/dev/gm.py x64.release
- テストもしたい場合は次のコードを実行します
tools/dev/gm.py x64.release.check
- 特にエラーが発生しなければひとまず大丈夫だと思います
ベンチマーク
-
GN
というメタビルドシステムを使ってV8をビルドしています。 - そこでは
gm
というスクリプトを使って、楽にビルドをしています。- これが上で使った
tools/dev/gm.py
- よく使うので簡単に使えるようにします
alias gm="${HOME}/v8/v8/tools/dev/gm.py"
- これが上で使った
- 一方、
GN
を直接使う方法とv8gen
というスクリプトを使う方法もあります。-
d8
を生成するために今回はv8gen
を使います。
-
- まずはエイリアスを作ります
alias v8gen="${HOME}/v8/v8/tools/dev/v8gen.py"
- このようにして、
v8gen
を使えるようにしたら、次はout/x64.release
というディレクトリにビルドファイルを生成します。v8gen -b 'V8 Linux64 - debug builder' -m client.v8 out/x64.release
- そして、ビルドターゲットを
d8
にしてコンパイルしますninja -C out/x64.release d8
- この際にできた、
d8
のバイナリをベンチマークでは使います
- 最初にCPUに関する設定をします
sudo tools/cpu.sh fast
- ここでは以下のようなオプションが使えます
fast
slow
default
dualcore
allcores
- 次に以下のようにすると生成した
d8
を指定する以下のコマンドを打つとベンチマークを取る準備ができます
❯ test/benchmarks/csuite/csuite.py sunspider baseline out/x64.release/d8
Wrote /home/jio/v8/v8/_results/master_sunspider.
Run sunspider again with compare mode to see results.
- 次に上の
baseline
の部分をcompare
に変更すると、ベンチマークが取れます
❯ test/benchmarks/csuite/csuite.py sunspider compare out/x64.release/d8
Wrote /home/jio/v8/v8/_results/master_sunspider_compare.
benchmark: score | master_ | % |
===================================================+==========+========+
3d-cube-sunspider: 6.4 S 6.4 S |
3d-morph-sunspider: 5.5 S 5.6 S 1.8 |
3d-raytrace-sunspider: 8.2 S 8.4 S 2.4 |
access-binary-trees-sunspider: 2.1 S 2.1 S |
access-fannkuch-sunspider: 8.0 S 8.1 S 1.2 |
access-nbody-sunspider: 3.0 S 3.1 S 3.3 |
access-nsieve-sunspider: 4.1 S 4.1 S |
bitops-3bit-bits-in-byte-sunspider: 1.5 S 1.5 S |
bitops-bits-in-byte-sunspider: 2.2 S 2.4 S 9.1 |
bitops-bitwise-and-sunspider: 1.4 S 1.5 S 7.1 |
bitops-nsieve-bits-sunspider: 3.6 S 3.7 S 2.8 |
controlflow-recursive-sunspider: 2.3 S 2.4 S 4.3 |
crypto-aes-sunspider: 5.7 S 5.9 S 3.5 |
crypto-md5-sunspider: 5.2 S 5.4 S 3.8 |
crypto-sha1-sunspider: 7.4 S 7.4 S |
date-format-tofte-sunspider: 5.7 S 5.8 S 1.8 |
date-format-xparb-sunspider: 5.5 S 5.4 S -1.8 |
math-cordic-sunspider: 3.2 S 3.2 S |
math-partial-sums-sunspider: 11.3 S 11.4 S 0.9 |
math-spectral-norm-sunspider: 1.7 S 1.7 S |
regexp-dna-sunspider: 4.7 S 4.8 S 2.1 |
string-base64-sunspider: 11.4 S 11.5 S 0.9 |
string-fasta-sunspider: 6.8 S 6.9 S 1.5 |
string-tagcloud-sunspider: 10.7 S 10.8 S 0.9 |
string-unpack-code-sunspider: 9.8 S 10.0 S 2.0 |
string-validate-input-sunspider: 5.9 S 6.1 S 3.4 |
SunSpider: 143.4 S 145.7 S 1.6 |
---------------------------------------------------+----------+--------+
- octane
❯ test/benchmarks/csuite/csuite.py octane baseline out/x64.release/d8
Wrote /home/jio/v8/v8/_results/master_octane.
Run octane again with compare mode to see results.
❯ test/benchmarks/csuite/csuite.py octane compare out/x64.release/d8
Wrote /home/jio/v8/v8/_results/master_octane_compare.
benchmark: score | master_ | % |
===================================================+==========+========+
ai-astar-orig: 52.6 || |
audio-beat-detection-orig: 37.8 S| |
audio-dft-orig: 39.7 S| |
audio-fft-orig: 25.7 S| |
audio-oscillator-orig: 30.3 S| |
imaging-gaussian-blur-orig: 66.7 || |
imaging-darkroom-orig: 100.0 S| |
imaging-desaturate-orig: 27.3 || |
json-parse-financial-orig: 25.8 S| |
json-stringify-tinderbox-orig: 14.9 S| |
stanford-crypto-aes-orig: 47.9 S| |
stanford-crypto-ccm-orig: 55.3 S| |
stanford-crypto-pbkdf2-orig: 52.7 S| |
stanford-crypto-sha256-iterative-orig: 20.0 S| |
RegExp: 11228.5 | 11344.4 | -1.0 |
Splay: 48092.0 | 49374.6 S -2.6 |
SplayLatency: 127522.5 | 131399.2 S -3.0 |
NavierStokes: 56780.0 | 58526.2 | -3.0 |
PdfJS: 59912.5 | 60972.6 S -1.7 |
Mandreel: 63425.5 | 65459.8 | -3.1 |
MandreelLatency: 92319.0 | 95933.7 S -3.8 |
Gameboy: 108245.5 S 111819.4 S -3.2 |
CodeLoad: 47260.5 | 48433.4 | -2.4 |
Box2D: 128085.5 S 130670.8 S -2.0 |
zlib: 88341.0 | 89049.3 | -0.8 |
Typescript: 43503.5 S 44798.6 S -2.9 |
se-financial-orig: 36.0 || |
Richards: 48639.0 | 50043.1 | -2.8 |
DeltaBlue: 124249.0 | 125270.8 S -0.8 |
Crypto: 57936.0 | 59224.2 | -2.2 |
RayTrace: 117806.0 | 117904.7 S |
EarleyBoyer: 83109.0 | 90267.7 S -7.9 |
Octane: 66739.5 | 68888.2 S -3.1 |
---------------------------------------------------+----------+--------+
- kraken
❯ test/benchmarks/csuite/csuite.py kraken baseline out/x64.release/d8
Wrote /home/jio/v8/v8/_results/master_kraken.
Run kraken again with compare mode to see results.
❯ test/benchmarks/csuite/csuite.py kraken compare out/x64.release/d8
Wrote /home/jio/v8/v8/_results/master_kraken_compare.
benchmark: score | master_ | % |
===================================================+==========+========+
ai-astar-orig: 52.2 S 53.7 S 2.9 |
audio-beat-detection-orig: 36.4 S 37.1 S 1.9 |
audio-dft-orig: 38.1 S 39.3 S 3.1 |
audio-fft-orig: 24.2 S 24.7 S 2.1 |
audio-oscillator-orig: 27.9 S 28.4 S 1.8 |
imaging-gaussian-blur-orig: 68.0 S 69.0 S 1.5 |
imaging-darkroom-orig: 99.8 | 100.6 S 0.8 |
imaging-desaturate-orig: 27.8 S 28.5 S 2.5 |
json-parse-financial-orig: 23.3 S 24.2 S 3.9 |
json-stringify-tinderbox-orig: 14.2 S 14.6 S 2.8 |
stanford-crypto-aes-orig: 45.0 S 46.1 S 2.4 |
stanford-crypto-ccm-orig: 51.5 S 52.2 S 1.4 |
stanford-crypto-pbkdf2-orig: 52.5 S 52.8 S 0.6 |
stanford-crypto-sha256-iterative-orig: 20.1 S 20.4 S 1.5 |
RegExp: 11138.0 | 10867.0 | 2.5 |
Splay: 47224.0 | 46018.0 | 2.6 |
SplayLatency: 124354.0 | 120312.0 | 3.4 |
NavierStokes: 53869.0 | 56986.0 | -5.5 |
PdfJS: 57028.0 | 55465.0 | 2.8 |
Mandreel: 62707.0 | 61418.0 | 2.1 |
MandreelLatency: 85952.0 | 89021.0 | -3.4 |
Gameboy: 105049.0 | 103498.0 | 1.5 |
CodeLoad: 46460.0 | 45627.0 | 1.8 |
Box2D: 122781.0 | 116262.0 | 5.6 |
zlib: 86336.0 | 83202.0 | 3.8 |
Typescript: 41398.0 | 37589.5 S 10.1 |
se-financial-orig: 36.0 | 22.0 | -38.9 |
Richards: 48364.0 | 44326.5 S 9.1 |
DeltaBlue: 121968.0 | 111561.0 | 9.3 |
Crypto: 56948.0 | 57020.0 | -0.1 |
RayTrace: 103524.0 | 112182.0 | -7.7 |
EarleyBoyer: 83109.0 | 76903.0 | 8.1 |
Kraken: 1324894.0 | 1293398.6 | -2.4 |
---------------------------------------------------+----------+--------+
以上でV8のベンチマークは完了です。
2. set up cross-toolchain for RISC-V(RV64GC) platform & try to cross compile the V8 to RV64GC
ソースコードの取得
- こちらからまずはソースコードを手に入れます。
- 適当なディレクトリで以下のコマンドを実行します
git clone https://github.com/riscv/riscv-gnu-toolchain
- 次にいくつか必要なソフトをインストールします
- Ubuntuの場合は以下のコマンドでインストールができます(面倒なので
-y
をつけました) sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev -y
- Ubuntuの場合は以下のコマンドでインストールができます(面倒なので
ビルド
- そして、以下のコマンドを実行すれば32-bitと64-bit両方用にビルドができます
./configure --prefix=/opt/riscv --enable-multilib
sudo make linux
- PATHを通して、実際にコンパイラが使えるようになったか確認します
-
export PATH="${PATH}:/opt/riscv/bin"
- この後に新しくターミナルを開くか、
source ~/.zshrc
などで読み込みます
- この後に新しくターミナルを開くか、
riscv64-unknown-linux-gnu-gcc -v
-
try to cross compile the V8 to RV64GC
- RV64GCのコンパイルが一応オプションが用意されているようです
-
gn args out.gn/riscv.release
を打って出てくるkey-valueを次のように変更します
is_component_build = false
target_cpu = "riscv64"
v8_target_cpu = "riscv64"
- 次のようにコマンドを打てば良いです
gm riscv64.release
- 何もしないとエラーになるので、PATHを通します
export PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:/usr/lib/x86_64-linux-gnu/pkgconfig/"
- また、必要なソフトもインストールもしておきます
sudo apt install g++-riscv64-linux-gnu
- そして、最後ビルドします
ninja -C out/riscv64.release d8
- うまくいくと次のようにビルドができているはずです
v8 on main via 🐍 v3.9.5 took 6s
❯ gn args out.gn/arm.release
Waiting for editor on "/home/jio/v8/v8/out.gn/arm.release/args.gn"...
Generating files...
Done. Made 230 targets from 97 files in 430ms
v8 on main via 🐍 v3.9.5 took 39s
❯ gm riscv64.release
# autoninja -C out/riscv64.release d8
ninja: Entering directory `out/riscv64.release'
[1766/1766] LINK ./d8
v8 on main via 🐍 v3.9.5 took 6m24s
❯ ninja -C out/riscv64.release d8
ninja: Entering directory `out/riscv64.release'
ninja: warning: bad deps log signature or version; starting over
[1816/1816] LINK ./d8
QEMU
- 最初にソースコードを手に入れます
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
git submodule init
git submodule update --recursive
- 必要な依存ソフトをインストールします
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
sudo apt-get install git-email
sudo apt-get install libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev
sudo apt-get install libcap-dev libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt-get install librbd-dev librdmacm-dev
sudo apt-get install libsasl2-dev libsdl1.2-dev libseccomp-dev libsnappy-dev libssh2-1-dev
sudo apt-get install libvde-dev libvdeplug-dev libvte-2.90-dev libxen-dev liblzo2-dev
sudo apt-get install valgrind xfslibs-dev
sudo apt-get install libnfs-dev libiscsi-dev
- 次にRISC-V用にビルドをします
❯ ./configure --target-list=riscv64-softmmu && make
Using './build' as the directory for build output
ERROR: glib-2.56 gthread-2.0 is required to compile QEMU
必要なライブラリは入れているはずなのにずっと失敗するので、QEMUを使うことは諦めてそのまま提出しました。
結果
お祈り〜
Regrettably, your application to be a mentee for RISC-V Mentorship: Porting V8 to RISC-V R32G mentorship has not been accepted.
Please reach out to program administrator with any questions, and we hope that you will consider submitting an application again in the future.
If you are interested in learning about how to get involved in the open source community, please contact us at mentorship@linuxfoundation.org.
言い訳
落ちたのは多分QEMUで動かせなかったからだと思います。
しかし、言い訳をすると
- 元々28日が締め切りだったのに23日の夜に25日締切にされた。
- 23日までは院試だった
ということがあります。他に候補者がいないのだから選んでくれてもいいじゃん:cry:
Discussion