AWS F1インスタンス上でRISC-Vコアを動かすことのできるFireSimは、徐々にバージョンが上がっており、現在はBOOM(Berkeley Out-of Order Machine)のLinux起動もサポートできるようになっているらしい。
一度、F1インスタンスのチュートリアルはやってみたことがあるのだが、しばらく時間もたっているし、前回はRocketコアで検証した環境を、BOOMコアを使って再検証してみたい。
チュートリアルを見ながら、再度FireSimをF1インスタンス上に構築するチュートリアルを試してみることにした。以下の資料を参考にした。
シングルノードのシミュレーション
ここでは、FireSimのシミュレーションを行う。シングルターゲットノードを"f1.2xlarge" (1 FPGA)に乗せてシミュレーションを実行することになる。
ターゲットソフトウェアのビルド
まずはFireSim上で動作させるソフトウェアのビルドを行う。今回のチュートリルでは、buildrootを使用した簡単なLinuxディストリビューションをビルドする。
cd firesim/sw/firesim-software ./marshal -v build workloads/br-base.json ... Running: "chmod +x /home/centos/firesim/sw/firesim-software/wlutil/br/firesim-overlay/firesim.sh" in /home/centos/firesim/sw/firesim-software Running: "mkdir /home/centos/firesim/sw/firesim-software/disk-mount" in /home/centos/firesim/sw/firesim-software Running: "sudo mount -o loop /home/centos/firesim/sw/firesim-software/images/br-base.img /home/centos/firesim/sw/firesim-software/disk-mount" in /home/centos/firesim/sw/firesim-software Running: "sudo rsync -a --chown=root:root /home/centos/firesim/sw/firesim-software/wlutil/br/firesim-overlay/* /home/centos/firesim/sw/firesim-software/disk-mount" in /home/centos/firesim/sw/firesim-software Running: "sudo umount /home/centos/firesim/sw/firesim-software/disk-mount" in /home/centos/firesim/sw/firesim-software Log available at: /home/centos/firesim/sw/firesim-software/logs/br-base-build-2019-04-06--03-51-50-6BCYY4R3BBCFUFGV.log
生成されたものは、
firesim/sw/firesim-software/images/br-disk-bin
: ブートローダとLinuxのカーネルイメージfiresim/sw/firesim-software/images/br-disk.img
- Linuxのディスクイメージ
では、次にFireSimで立ち上げるデザインの構成を行う。この構成はdeploy/config_runtime.ini
で設定する。デフォルトは以下のようになっていた。
# RUNTIME configuration for the FireSim Simulation Manager # See docs/Advanced-Usage/Manager/Manager-Configuration-Files.rst for documentation of all of these params. [runfarm] runfarmtag=mainrunfarm f1_16xlarges=1 m4_16xlarges=0 f1_4xlarges=0 f1_2xlarges=0 runinstancemarket=ondemand spotinterruptionbehavior=terminate spotmaxprice=ondemand [targetconfig] topology=example_8config no_net_num_nodes=2 linklatency=6405 switchinglatency=10 netbandwidth=200 profileinterval=-1 # This references a section from config_hwconfigs.ini # In homogeneous configurations, use this to set the hardware config deployed # for all simulators defaulthwconfig=firesim-quadcore-nic-ddr3-llc4mb [tracing] enable=no startcycle=0 endcycle=-1 [workload] workloadname=linux-uniform.json terminateoncompletion=no
このファイルで以下の行を変更する。
- 変更前
f1_16xlarges=1 m4_16xlarges=0 f1_4xlarges=0 f1_2xlarges=0
- 変更後
f1_16xlarges=0 m4_16xlarges=0 f1_4xlarges=0 f1_2xlarges=1
- 変更前
defaulthwconfig=firesim-quadcore-nic-ddr3-llc4mb
- 変更後
defaulthwconfig=fireboom-singlecore-no-nic-ddr3-llc4mb # BOOMの場合 # defaulthwconfig=firesim-quadcore-no-nic-ddr3-llc4mb # Rocket-Chipの場合
- 変更前
topology=example_8config no_net_num_nodes=2
- 変更後
topology=no_net_config no_net_num_nodes=1
この設定が完了すると、deploy/config_runtime.ini
は以下のようになっているはずだ。
# RUNTIME configuration for the FireSim Simulation Manager # See docs/Advanced-Usage/Manager/Manager-Configuration-Files.rst for documentation of all of these params. [runfarm] runfarmtag=mainrunfarm f1_16xlarges=0 m4_16xlarges=0 f1_4xlarges=0 f1_2xlarges=1 runinstancemarket=ondemand spotinterruptionbehavior=terminate spotmaxprice=ondemand [targetconfig] topology=no_net_config no_net_num_nodes=1 linklatency=6405 switchinglatency=10 netbandwidth=200 profileinterval=-1 # This references a section from config_hwconfigs.ini # In homogeneous configurations, use this to set the hardware config deployed # for all simulators defaulthwconfig=firesim-quadcore-no-nic-ddr3-llc4mb [tracing] enable=no startcycle=0 endcycle=-1 [workload] workloadname=linux-uniform.json terminateoncompletion=no
これでデザインの構成は完了となる。次に、F1インスタンスを起動する。
$ firesim launchrunfarm
以下の出力が得られるはず。これで、先ほど設定したf1_2xlarges
が立ち上がった。これをE2マネジメントコンソールで確認してみる。
~/firesim$ firesim launchrunfarm FireSim Manager. Docs: http://docs.fires.im Running: launchrunfarm Waiting for instance boots: 0 f1.16xlarges Waiting for instance boots: 0 f1.4xlarges Waiting for instance boots: 0 m4.16xlarges Waiting for instance boots: 1 f1.2xlarges i-0bd1ac5bfadc33b28 booted! The full log of this run is: /home/centos/firesim/deploy/logs/2019-04-10--14-14-58-launchrunfarm-5A5C62RIA49RZ71E.log
f1.2xlarges
のインスタンスが追加されており、FPGAが立ち上がったことが確認できる。では、いよいよRocket-Chipデザインを流し込む。
~/firesim$ firesim infrasetup FireSim Manager. Docs: http://docs.fires.im Running: infrasetup Building FPGA software driver for FireSimNoNIC-FireSimRocketChipQuadCoreConfig-FireSimDDR3FRFCFSLLC4MBConfig90MHz [192.168.0.87] Executing task 'instance_liveness' [192.168.0.87] Checking if host instance is up... [192.168.0.87] Executing task 'infrasetup_node_wrapper' [192.168.0.87] Copying FPGA simulation infrastructure for slot: 0. [192.168.0.87] Installing AWS FPGA SDK on remote nodes. Upstream hash: e5b68dd8d432c746f7094b54abf35334bc51b9d1 [192.168.0.87] Unloading XDMA/EDMA/XOCL Driver Kernel Module. [192.168.0.87] Copying AWS FPGA XDMA driver to remote node. [192.168.0.87] Unloading XDMA/EDMA/XOCL Driver Kernel Module. [192.168.0.87] Loading XDMA Driver Kernel Module. [192.168.0.87] Clearing FPGA Slot 0. [192.168.0.87] Checking for Cleared FPGA Slot 0. [192.168.0.87] Flashing FPGA Slot: 0 with agfi: agfi-0fd2554e204e2b0e3. [192.168.0.87] Checking for Flashed FPGA Slot: 0 with agfi: agfi-0fd2554e204e2b0e3. [192.168.0.87] Unloading XDMA/EDMA/XOCL Driver Kernel Module. [192.168.0.87] Loading XDMA Driver Kernel Module. [192.168.0.87] Starting Vivado hw_server. [192.168.0.87] Starting Vivado virtual JTAG. The full log of this run is: /home/centos/firesim/deploy/logs/2019-04-10--14-16-15-infrasetup-59BRLK66FUS135F6.log
無事にRocket-ChipがFPGAに書き込まれた。ベンチマーク(Linux) を立ち上げてみる。
$ firesim runworkload
上記のコマンドにより、コンソール画面はFireSimのステータスを表示するモードに切り替わる。以下のようなステータスが表示されるようになり、10秒毎に更新されるモードになる。
FireSim Simulation Status @ 2019-04-10 14:26:09.350651 -------------------------------------------------------------------------------- This workload's output is located in: /home/centos/firesim/deploy/results-workload/2019-04-10--14-25-54-linux-uniform/ This run's log is located in: /home/centos/firesim/deploy/logs/2019-04-10--14-25-54-runworkload-IDT2XJ7JMHCI2P51.log This status will update every 10s. -------------------------------------------------------------------------------- Instances -------------------------------------------------------------------------------- Instance IP: 192.168.0.87 | Terminated: False -------------------------------------------------------------------------------- Simulated Switches -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- Simulated Nodes/Jobs -------------------------------------------------------------------------------- Instance IP: 192.168.0.87 | Job: linux-uniform0 | Sim running: True -------------------------------------------------------------------------------- Summary -------------------------------------------------------------------------------- 1/1 instances are still running. 1/1 simulations are still running. --------------------------------------------------------------------------------
このままではRocket-Chipにログインできないため、もう一度同じIPでマネージャインスタンスにログインする。以下を入力し、sourceme-f1-manager.sh
を読み込む。
$ cd firesim $ source sourceme-f1-manager.sh
最初のコンソールを確認すると、インスタンスのIPとして192.168.0.87
が割り当てられていることが確認できる。このため、このIPにSSHでログインし、シリアルで接続してFireSimの状態を確認する。
$ ssh 192.168.0.87
$ screen -r fsim0
すると、以下のような画面が表示された。FireSim上でLinuxがブートしている最中だったようだ。しばらくするとログイン画面が表示され、ログインできるようになる。ユーザ名root
、パスワードfiresim
でログインできる。
これで、F1インスタンス上で動作しているRocket-Chipにログインすることができた。試しに、uname -a
をしてみる。
# uname -a Linux buildroot 4.15.0-rc6-31587-gcae6324ee357 #1 SMP Wed Apr 10 12:07:35 UTC 2019 riscv64 GNU/Linux
RISC-Vコアであることが認識されており、正しく動作している。次に、/proc/cpuinfo
を確認した。
# cat /proc/cpuinfo hart : 0 isa : rv64imafdc mmu : sv39 uarch : ucb-bar,boom0
BOOMコアだ。素晴らしい。
シャットダウン
Rocket-Chipをシャットダウンするためには、poweroff -f
でシャットダウンする。
シャットダウンしたのち、F1インスタンスをTerminateする。これを放置していると、F1インスタンスが立ち上がりっぱなしになってしまい大変な料金を徴収されてしまう。
$ firesim terminaterunfarm
EC2マネジメントコンソールで、f1.2xlarge
のインスタンスがTerminateされたことを確認しておく。
メモ : firesim infrasetup
が完了しない!
firesim infrasetup
を実行しても、[192.168.0.87] Checking if host instance is up...
と表示されその先に進まないことがある。
これは、EC2のセキュリティグループにfiresimと名の付くセキュリティグループが2つ以上存在している場合に発生するようだった。
セキュリティグループを確認し、firesim
と名の付くグループをすべて削除したのちに、t2.nano
インスタンスでのAWSセットアップ作業からやり直すのが確実のようだ。