FPGA開発日記

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

AWS F1インスタンス上のFireSimでBOOMコアをシミュレーションする試行(4. F1インスタンスの立ち上げとLinuxのブート)

f:id:msyksphinz:20190405012417p:plain

AWS F1インスタンス上でRISC-Vコアを動かすことのできるFireSimは、徐々にバージョンが上がっており、現在はBOOM(Berkeley Out-of Order Machine)のLinux起動もサポートできるようになっているらしい。

fires.im

一度、F1インスタンスチュートリアルはやってみたことがあるのだが、しばらく時間もたっているし、前回はRocketコアで検証した環境を、BOOMコアを使って再検証してみたい。

チュートリアルを見ながら、再度FireSimをF1インスタンス上に構築するチュートリアルを試してみることにした。以下の資料を参考にした。

docs.fires.im

シングルノードのシミュレーション

ここでは、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で立ち上げるデザインの構成を行う。この構成は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
f:id:msyksphinz:20190411001700p:plain
EC2マネジメントコンソールの様子。f1.2xlargesが立ち上がっていることが分かる。

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.
--------------------------------------------------------------------------------
f:id:msyksphinz:20190411001820p:plain
FireSimの動作状態確認モード

このままでは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でログインできる。

f:id:msyksphinz:20190411001959p:plain
FireSimでRISC-Vコア上のLinuxがブートしたところ

これで、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
f:id:msyksphinz:20190411002411p:plain
Linux上で`uname -a`を実行した結果。

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セットアップ作業からやり直すのが確実のようだ。