🐿️

RISC-V Mentorship: Porting V8 to RISC-V R32Gに採用されなかった

2021/08/27に公開

RISC-V Mentorship

RISC-V Mentorship ProgramとはRISC-Vに関連した、あるプロジェクトにアサインされ、そこで12周間メンターシップを受けられるというものです。

私はこちらのV8をRISC-Vに移植するというプロジェクトに興味が湧き、他に応募者がいないので応募してみました。

application

応募に際して事前にいくつかの課題が与えられました。確か以下の3つです

  • 大学の許可はあるか(書類を提出する必要はなくチェックを付けるだけで良い)
  • 履歴書
  • なぜこのプロジェクトを選んだのかについての文書

上2つはそのまま。最後のはコンパイラに興味がある、RISC-Vに関して深い知識を得てコミュニティに貢献をしたいみたいなことを書いた気がします。

ここは通りました。

Pre-task

次に以下のタスクが与えられました。

  1. Find the source code repo of V8. Build it on your machines. Run Octane/Kraken/SunSpider benchmarks using the d8l you just built.
  2. 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.
  3. 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

ビルド

  • そして、以下のコマンドを実行すれば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
❯ ./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