SDAccelは大きいインスタンスで合成が速くなるのか試してみた #FPGA

2017.10.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

SDAccelとは、XilinxのFPGA向けOpenCLプラットフォームのことです。先日のFPGAエクストリームコンピューティング#9でお話させていただいたとき、質問に自信ある回答ができなかった件があったのですが、実際に試して確認してみました。

FPGAの開発の際に、合成(コンパイル)のプロセスには長い時間がかかります。これまでFPGA Developer AMIを試す際には30GiBのメモリが要件ということで、まよわず推薦環境の一つc4.4xlargeを使っていました。インスタンスサイズを変えると、この時間が短縮可能なのかどうか、ということがご質問の趣旨でした。

サンプル helloworld_ocl を、ハードウェア向け環境(!=エミュレーション)にビルドするプロセスには、2時間以上の時間を要します(HelloWorldに2時間超とは、にわかには信じがたいくらいの長時間です)。これを、メモリやCPUを奢ることで、どうにか速くすることができないのかということです。

予想としては、必要なリソースが確保できているのであれば、サイズを大きくしたとしても効果は少ないのではと考えており、当日もそのように回答したつもりでした。しかしあくまで予想であり、根拠や自信があるわけではありませんでしたので、実際に検証してみました。

ちなみに検証は東京リージョン(ap-northeast-1)で行いました。

AMIを準備する

複数のインスタンスタイプで同じ測定を行いますので、SDAccel環境のセットアップ(ドライバのインストール等)など、あらかたの準備を済ませたAMIを作成しておくことにしました。適当なインスタンス(c4.4xlarge)を使い、FPGA Developer AMIを起動し、必要なツールやライブラリもインストールしたあと、sdaccel環境の初期化スクリプトを実行しておきます。

$ sudo yum install -y libstdc++-static gdb opencv libjpeg-turbo-devel libpng12-devel libtiff-devel compat-libtiff3
$ cd src/project_data/aws-fpga/
$ source sdaccel_setup.sh
$ source $XILINX_SDX/settings64.sh

マネージメントコンソールから、イメージの作成を選びAMIを作成しておきます。

それぞれのインスタンスタイプで実験する際に、このAMIを使って起動します。ツールやドライバはセットアップ済みになるのですが、環境変数などは、設定必要なので 、それぞれのインスタンスの起動後に、以下を実行することが必要です。

$ cd src/project_data/aws-fpga/
$ source sdaccel_setup.sh
$ source $XILINX_SDX/settings64.sh

以下はいくつもインスタンスを立ち上げて、それぞれの処理が終わるのを待っている様子です。

sdaccel-comparison

c4.4xlarge

まずは基準として、c4.4xlargeを使った場合です。インスタンスのスペックは以下の通りです。

sdaccel-c4.4xlarge

ビルドするのに要する時間を計測します。要した時間はログに表示されていますが、timeコマンドでも計測してみました。 ビルドはmakeでできますのでtimeによる計測は簡単に可能です。

ログとtimeコマンドの出力を下記に示します。

$ cd $SDACCEL_DIR/examples/xilinx/getting_started/host/helloworld_ocl/
$ time make TARGETS=hw DEVICES=$AWS_PLATFORM all
...
Creating Vivado project and starting FPGA synthesis.
................................................................................................................................
Finished 1st of 5 tasks (FPGA synthesis). Elapsed time: 00h 29m 21s.
.....
Finished 2nd of 5 tasks (FPGA logic optimization). Elapsed time: 00h 04m 57s.
...............................
Finished 3rd of 5 tasks (FPGA logic placement). Elapsed time: 00h 38m 38s.
................................
Finished 4th of 5 tasks (FPGA routing). Elapsed time: 00h 45m 48s.
INFO: [XOCC 60-586] Created xclbin/vector_addition.hw.xilinx_aws-vu9p-f1_4ddr-xpr-2pr_4_0.xclbin
INFO: [XOCC 60-791] Total elapsed time: 2h 8m 22s

real    133m27.050s
user    33m52.721s
sys    1m33.759s

やはり2時間ちょっとを要しました。timeコマンドの出力を見ると、real(実時間)にくらべて、userの消費時間が少ないです。CPUをあまり有効に使えていない感じがします。マルチコアであればコア数分のユーザ時間が使えるはずですので、その意味でも見劣りしています。

r4.4xlarge

では、比較としてメモリを増やしてみるとどうなるでしょうか。計算能力ECUの数値がc4.4xlargeと同程度、しかし4倍のメモリが使えるr4.4xlargeを選んでみました。インスタンスのスペックは以下の通りです。

sdaccel-r4.4xlarge

結果は以下の通り。改善せず、逆に少し悪化するという結果になりました。メモリを増やしてもほとんど効かないようです。

...
Creating Vivado project and starting FPGA synthesis.
................................................................................................................................
Finished 1st of 5 tasks (FPGA synthesis). Elapsed time: 00h 34m 48s.
.....
Finished 2nd of 5 tasks (FPGA logic optimization). Elapsed time: 00h 05m 42s.
...............................
Finished 3rd of 5 tasks (FPGA logic placement). Elapsed time: 00h 43m 38s.
................................
Finished 4th of 5 tasks (FPGA routing). Elapsed time: 00h 52m 16s.
...
INFO: [XOCC 60-586] Created xclbin/vector_addition.hw.xilinx_aws-vu9p-f1_4ddr-xpr-2pr_4_0.xclbin
INFO: [XOCC 60-791] Total elapsed time: 2h 27m 29s

real    153m53.941s
user    38m46.695s
sys    1m50.346s

c4.8xlarge

メモリが効かないことがわかりましたので、今度はCPUを増やしてみます。c4.4xlargeに比べて倍のサイズであるc4.8xlarge を選びます。 ECUだけでなく、メモリも倍になります。スペックは以下の通りです。

sdaccel-c4.8xlarge

結果は以下の通りです。基準となるc4.4xlargeと比べて、逆に少し悪くなっています。 同時に試したわけではないので、稼働した時間帯にも影響を受けているのかもしれません。少なくともインスタンスサイズを倍増させたとしても、効果は無さそうです。

...
Creating Vivado project and starting FPGA synthesis.
................................................................................................................................
Finished 1st of 5 tasks (FPGA synthesis). Elapsed time: 00h 30m 31s.
.....
Finished 2nd of 5 tasks (FPGA logic optimization). Elapsed time: 00h 05m 12s.
...............................
Finished 3rd of 5 tasks (FPGA logic placement). Elapsed time: 00h 40m 43s.
................................
Finished 4th of 5 tasks (FPGA routing). Elapsed time: 00h 49m 04s.
...
INFO: [XOCC 60-586] Created xclbin/vector_addition.hw.xilinx_aws-vu9p-f1_4ddr-xpr-2pr_4_0.xclbin
INFO: [XOCC 60-791] Total elapsed time: 2h 15m 55s

real    141m21.110s
user    34m52.524s
sys    1m52.224s

c4.xlarge

あまりにこれまでの結果が変化なさすぎなので、逆に今度はインスタンスを小さくしてみました。1/4サイズのc4.xlargeです。スペックは以下の通りです。

sdaccel-c4.xlarge

結果は以下のとおりです。こちらは順当に、インスタンスを小さくすると処理時間が長くかかるようになりました。基準の2時間強に比べて5時間超となり、1/4サイズのインスタンスによる結果としては納得感があります。

...
Creating Vivado project and starting FPGA synthesis.
................................................................................................................................
Finished 1st of 5 tasks (FPGA synthesis). Elapsed time: 01h 42m 13s.
.....
Finished 2nd of 5 tasks (FPGA logic optimization). Elapsed time: 00h 09m 57s.
...............................
Finished 3rd of 5 tasks (FPGA logic placement). Elapsed time: 01h 39m 53s.
................................
Finished 4th of 5 tasks (FPGA routing). Elapsed time: 01h 20m 40s.
...
INFO: [XOCC 60-586] Created xclbin/vector_addition.hw.xilinx_aws-vu9p-f1_4ddr-xpr-2pr_4_0.xclbin
INFO: [XOCC 60-791] Total elapsed time: 5h 11m 59s

real    317m9.910s
user    42m44.961s
sys    3m11.342s

まとめ

FPGA Developer AMIを使う場合、推薦環境であるc4.4xlargeの環境からインスタンスサイズを大きくしても、処理に要する時間にはほとんど影響しないことがわかりました。逆にインスタンスサイズを小さくすると、顕著に要する時間が伸びます。ですので、素直に推薦環境であるc4.4xlargeを使うのが良いという結果でした。

ただし以上は、helloworld_oclという小さいサンプルを対象にした結果です。もっと大きいプロジェクトの場合には、大きいインスタンスを使うことが効果があるかもしれません。プロジェクトが大きくなってきて、処理時間が長くなった場合には、インスタンスサイズを増やすのは試してみても良さそうです。

もしかするとSDAccelやVivadoの開発環境のどこかにチューニングパラメータが存在するのかもしれませんが、調べることができていません。あくまでFPGA Developer AMIをデフォルトのまま使った結果です。

超ニッチな誰得情報ですが、以上の結果を共有します。どなたか(クラウドFPGA開発仲間)のご参考になれば幸いです。

補足

サンプルで用意されているMakefileでは、make cleanだとTARGETS=hw向けに作成したファイルは消してくれないようですので、再度ビルドする際には、rmで消す必要があるようです。

$ make clean
$ rm xclbin/*

参考