FC2カウンター FPGAの部屋 2017年04月26日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

AXI4マスタ版ラプラシアン・フィルタ最速の条件

この記事はFPGAマガジンNo.17 に載るはずだったけど、ページが足りなくて載せることができなかったコラムです。

今回、「高位合成ツールVivado HLS 特設記事」第2章で説明した第5段階のAXI4マスタ版のラプラシアン・フィルタですが、その最速の条件を探すためにCソースコードを少しずつ変更して最速の条件を確かめてみました。

AXI4マスタ・ライトのみにif文を使用した場合
まずは、出力の画像フォーマットを出力画像の回り1ビットが0のフォーマットに戻してみましょう。つまり、「高位合成ツールVivado HLS 特設記事」第1章、図23の左の出力画像フォーマットにしてみようと思います。特設記事第2章のリスト1のlap変数をlap_fb[]にライトする部分を少し変更します。特設記事第2章のリスト1では、lap_fp[]にライトするときにifなどの条件文は使用していませんでしたが、今回はif文を使用します。具体的には、変数yが0のとき(つまり最初の行)は、lapの値は0に設定しているので、lap_fb[]の最後の行に書き込むことにします。変数yが1以降のとき(2番目以降の行)では、lap_fb[]の最初の行から順に書き込みます。この部分を抜き出してリスト1 に示します。

             if (y == 0)
                lap_fb[(VERTICAL_PIXEL_WIDTH-1)*HORIZONTAL_PIXEL_WIDTH+x] = lap;
            else
                lap_fb[(y-1)*HORIZONTAL_PIXEL_WIDTH+x] = lap;

リスト 1:  lap_fb[]のライト部分の変更点


Cコードの合成のLatencyは480019クロックでした。なお、今回の画像は800ピクセルx 600行の画像を使用しています。つまり、1ピクセル1クロックとして全てのピクセルを処理すると480000クロック必要です。それと比較するとCコード合成時のLatencyは効率が良いと言えると思います。次にC/RTL協調シミュレーションを行うと、Latencyは1120051クロックでした。Cコードの合成のときのLatencyからすると2倍以上にレイテンシが増えています。C/RTL協調シミュレーション波形を見ると、リードは16バーストなのですが、ライトはシングル転送になっていました。このためC/RTL協調シミュレーション時のレイテンシが増えてしまったようです。詳しくは、「AXI4-Stream向きのコードで書いたラプラシアンフィルタをVivado HLSでテスト2」をご覧ください。

AXI4マスタのリードとライト両方にif文を使用した場合
次に、出力の画像フォーマットを出力画像の回り1ビットが0のフォーマットに戻すのは同じですが、1行余計にループを回すことにします。最初の行はlap_fb[]に書き込まないようにし、最後の行(つまり、1行多いので、リードするピクセルはもう残っていないため)cam_fb[]から読み込まないようにします。つまり、リードもライトもif文が入ることになります。リード部分の変更点をリスト2 にライト部分の変更点をリスト3 に示します。

    for (int y=0; y<=VERTICAL_PIXEL_WIDTH; y++){
        for (int x=0; x<HORIZONTAL_PIXEL_WIDTH; x++){
#pragma HLS PIPELINE
            if (y < VERTICAL_PIXEL_WIDTH)
                pix = cam_fb[y*HORIZONTAL_PIXEL_WIDTH+x];

リスト 2:  cam_fb[]のリード部分の変更点


            if (y != 0)
                lap_fb[(y-1)*HORIZONTAL_PIXEL_WIDTH+x] = lap;

リスト 3:  lap_fb[]のライト部分の変更点


この実装では、Cコードの合成時のLatencyは480821クロックでした。この実装でも、画像は800ピクセルx 600行の画像を使用しています。次にC/RTL協調シミュレーションを行ってみたところ、1121430クロックでした。この実装でも、Cコードの合成のときのLatencyからすると2倍以上にレイテンシが増えています。しかも、「AXI4マスタ・ライトのみにif文を使用した場合」よりも遅くなってしまいました。C/RTL協調シミュレーション波形を見ると、リードもライトもシングル転送でした。詳しくは、「AXI4-Stream向きのコードで書いたラプラシアンフィルタをVivado HLSでテスト3」をご覧ください。

2つの実装の結果から言えることは、メモリにリード、ライトする記述にif文があるとシングル転送になるのではないか?ということです。つまり、AXI4マスタ版で最速実装ができる幅は狭いということが言えると思います。
  1. 2017年04月26日 20:30 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

FPGAマガジンNo.17にVivado HLS の記事を書きました(ソースコードをGitHubで公開)

FPGAマガジンNo.17 の 80 ページから「高位合成ツールVivado HLS 特設記事」ということで、記事を書きました。
なお、その記事中に使用したC や C++ のソースコードをGitHubで公開しました。

第1章
【データが順番に流れるならストリームが最適】
無料のVivado HL WebPACK Edition 2016.4で高位合成にチャレンジしよう(AXI4ストリーム編)
AXI4ストリームによるラプラシアン・フィルタ処理回路の実装

でVivado HLS のAXI4-Stream編として書きました。これが本命だと思っています。このようにデータのストリーミング中に処理を行うという方法がFPGA に合っていると言いますか、これができないようだとCPU やGPU に処理速度で負けちゃうんじゃないでしょうか?というのが私の意見です。
このソースコードは、marsee101/FPGAmagagine17_Vivado_HLS_AXI4S にアップロードしてあります。

第2章
【これ以上の高速化は難しい?!】
無料のVivado HL WebPACK Edition 2016.4で高位合成にチャレンジしよう(AXI4ストリーム編)
ついに80倍高速化!AXI4マスタ版ラプラシアン・フィルタの最適化

第2章ではVivado HLS のAXI4 Master 編(FPGAマガジンNo.16)でアルゴリズムの通りに実装したラプラシアンフィルタ回路と最適化を行ったラプラシアンフィルタ回路の間の性能差は約 25 倍でしたが、約 80 倍の性能のAXI4 Master のラプラシアンフィルタ回路ができたので、ご紹介しました。もう原理的に限界の性能を出すことができました。記事のタイトルが誤解を招くかもしれませんが、これはAXI4-Stream インターフェースではなく、AXI4 インターフェースのMaster です。AXI4-Stream 版とい同じように書いたら最速になった、AXI4 インターフェースのMaster 版のラプラシアンフィルタ回路の話です。よろしくお願いします。
まあ、本当はどのように書いても同じように最速だったら良いのですが、ソースコードの意図を回路に反映するのか?しないのか?という話もあるので、一概には言えないと思います。ソースコードの意図を無視して、いつも最速にしちゃってよいのか?という話はありますよね。。。
この最速のAXI4 Master のソースコードは marsee101/FPGAmagagine16_Vivado_HLS_AXI4M/lap_filter5_axim/ にあります。
  1. 2017年04月26日 04:57 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0