RISC-V の実装であるRocket-CoreとかBOOMとか、マルチコアの環境ではどのようになるのだろう?気になることは多い。
とりあえず fpga-zynq リポジトリを使えばシングルコアのRocket-Coreを試すことは出来るが、BOOMは構成としてはRocket-Coreよりも大きく、ZedBoard級のFPGAボードには入らない。
残念ながら、UCBとしてもこれ以上FPGAでの実機動作システムをサポートするつもりもないらしい。 BOOMのFPGA向けの構成がリリースされないのもおそらくこれが原因らしい。 どうも大規模なFPGA向けの構成は、Amazon F1に頼る必要がありそうだ。こちらも調査していかなければ、ついて行けそうにない。
以下のサイトを参考にした。
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-singlenode
とboot-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.

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

単一コアでの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