FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

FireSimを使ってRocket-ChipをAmazon F1インスタンスで動かす試行

RISC-V の実装であるRocket-CoreとかBOOMとか、マルチコアの環境ではどのようになるのだろう?気になることは多い。

とりあえず fpga-zynq リポジトリを使えばシングルコアのRocket-Coreを試すことは出来るが、BOOMは構成としてはRocket-Coreよりも大きく、ZedBoard級のFPGAボードには入らない。

残念ながら、UCBとしてもこれ以上FPGAでの実機動作システムをサポートするつもりもないらしい。 BOOMのFPGA向けの構成がリリースされないのもおそらくこれが原因らしい。 どうも大規模なFPGA向けの構成は、Amazon F1に頼る必要がありそうだ。こちらも調査していかなければ、ついて行けそうにない。

以下のサイトを参考にした。

fires.im

F1インスタンスの種類

現状、FireSimでは2種類の構成をサポートしている。

さらに、FireSimのデモンストレーション用のAMI (Amazon Marketplace Instance) が用意されているのでそれを使うのがよさそうだ。 このAMIを立ち上げると、CentOSが立ち上がるようで、さらにF1インスタンスとのリンクアップも行われる。

AMIのコンテンツ

AMIのインスタンスには、F1インスタンス上でRocket-Chipを動作させるためのいくつかのツールが用意されている。

  • riscv64-unknown-* ツールチェイン
  • ~/firesim-target-software : ノード上で動作するためのカスタムビルドディスとりぶーしょん
  • FireSim-f1 FPGAとのコミュニケーションを管理する。
  • boot-firesim-singlenodeboot-firesim-cluster : このスクリプトによって、FireSim-f1 プログラムを起動する。

注意点なのだが、F1インスタンスを使うときは、F1インスタンスの使用制限を解除しておかなければならないようだ。 F1インスタンスの現状の使用上限は0となっているようで、これを1に設定してF1インスタンスを使えるようにするためには、サービスリクエストを送信する。

If you are a new EC2 user, it is also likely that your service limit for F1 instances will be set to zero. You can check your limit at this link. Confirm that the limit for f1.2xlarge instances is greater than zero. If it isn’t, follow the instructions to submit a service limit increase here to request access to F1 instances. Set an initial request size of 1 for either f1.2xlarge or f1.16xlarge instances in N. Virginia.

f:id:msyksphinz:20180324153043p:plain
図. デフォルトではF1インスタンスは使用上限が0に設定されているので、上限を緩和するリクエストを行う。

F1インスタンスの申請が完了すると、さっそくF1インスタンスでFireSimを立ち上げて、ログインを行う。 ログイン名は centosSSHのKeyを登録しておけばそのままログインできる。 ちなみに、West Virginia のインスタンスなので、タイピングの反応速度は微妙。

f:id:msyksphinz:20180326232341p:plain
図. Amazon F1 インスタンスを立ち上げて、ログインする

単一コアでのRocket-Coreを動作させる

既にシングルコアのRocket-Coreのイメージが作成されているので、起動は簡単。 以下のコマンドでRocket-Coreのイメージをロードし、F1インスタンスでRocket-Coreを起動する。

[centos@ip-XXX-XX-XX-XXX ~]$ sudo fpga-load-local-image -S 0 -I agfi-00a74c2d615134b21
AFI          0       agfi-00a74c2d615134b21  loaded            0        ok               0       0x071417d3
AFIDEVICE    0       0x1d0f      0xf000      0000:00:1d.0
[centos@ip-XXX-XX-XX-XXX ~]$ boot-firesim-singlenode
Simulations Started. You can use the UART console of each simulated node by attaching to the following screens:
There is a screen on:
        2452.fsim0      (Detached)
1 Socket in /var/run/screen/S-centos.

Rocket-Core上でLinuxが立ち上がっているので、ログインしてみる。できた!

[centos@ip-XXX-XX-XX-XXX ~]$ TERM=linux ssh root@192.168.
ssh: Could not resolve hostname 192.168.: Name or service not known
[centos@ip-XXX-XX-XX-XXX ~]$ TERM=linux ssh root@192.168.1.10
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
ECDSA key fingerprint is 8d:de:af:28:8f:83:b4:3c:b0:e8:0b:51:30:a4:4f:dc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.10' (ECDSA) to the list of known hosts.
root@192.168.1.10's password:
# uname -a
Linux buildroot 4.12.0-rc2 #1 Fri Aug 4 03:44:55 UTC 2017 riscv64 GNU/Linux

Memcachedによる性能測定

チュートリアルでは、memcachedによる性能測定を行うが、今回はシングルノードしか持っておらず、しかもあまり長時間流すとお金がかかりそうなので途中で止めてしまった。

そのときのログだけ張っておく。なんだか大量にメッセージが出ていたのだが、大丈夫かなあ?

  • load_log
[OVERALL], RunTime(ms), 90238
[OVERALL], Throughput(ops/sec), 0.0
[TOTAL_GCS_PS_Scavenge], Count, 0
[TOTAL_GC_TIME_PS_Scavenge], Time(ms), 0
[TOTAL_GC_TIME_%_PS_Scavenge], Time(%), 0.0
[TOTAL_GCS_PS_MarkSweep], Count, 0
[TOTAL_GC_TIME_PS_MarkSweep], Time(ms), 0
[TOTAL_GC_TIME_%_PS_MarkSweep], Time(%), 0.0
[TOTAL_GCs], Count, 0
[TOTAL_GC_TIME], Time(ms), 0
[TOTAL_GC_TIME_%], Time(%), 0.0
[CLEANUP], Operations, 1
[CLEANUP], AverageLatency(us), 3.0007296E7
[CLEANUP], MinLatency(us), 29999104
[CLEANUP], MaxLatency(us), 30015487
[CLEANUP], 95thPercentileLatency(us), 30015487
[CLEANUP], 99thPercentileLatency(us), 30015487
[CLEANUP], 30015487, 1.0
[INSERT], Operations, 0
[INSERT], AverageLatency(us), NaN
[INSERT], MinLatency(us), 9223372036854775807
[INSERT], MaxLatency(us), 0
[INSERT], 95thPercentileLatency(us), 0
[INSERT], 99thPercentileLatency(us), 0
[INSERT], Return=ERROR, 1
[INSERT-FAILED], Operations, 1
[INSERT-FAILED], AverageLatency(us), 6.004736E7
[INSERT-FAILED], MinLatency(us), 60030976
[INSERT-FAILED], MaxLatency(us), 60063743
[INSERT-FAILED], 95thPercentileLatency(us), 60063743
[INSERT-FAILED], 99thPercentileLatency(us), 60063743
[INSERT-FAILED], 60063743, 1.0