kazuk は null に触れてしまった

C# / .NET 系技術ネタ縛りでお送りしております

Vivado HLS での高位合成を業務系バッチに適用できるか試してみる


 

Amazon の FPGA F1 インスタンスでは、Xilinx の Vivado および Vivado HLS で設計を行う事になる。

Vivado が Velilog 等 RTL でのハードウェア記述で FPGA へ投入するBitstreamを生成するのに対して、Vivado HLS が C / C++ でのロジック記述から高位合成を行うという事でソフトウェアエンジニアとしては多少記述の抽象度が低いとは言え C /C++ で記述できるのはうれしいことだ。

Vivado HLS についての記述例やサンプルを色々眺めてみても bitmap を扱う例だったり業務データの扱いによくあるレコード的な物が無かったりしたので、とりあえず構造体使えるの?程度に試してみたのが以下。

#include <hls_stream.h>

struct OrderLine
{
    int itemId;
    int amount;
    int unitPrice;
};

long foo( hls::stream<OrderLine> indata, int count)
{
    long totalPrice =0;

    for( int i=0;i<count;i+=4 )
    {
        OrderLine line0;
        indata.read(line0);
        totalPrice += line0.unitPrice * line0.amount;
    }
    return totalPrice;
}

よくあるっちゃよくある、注文明細行なめて、単価x個数を集計するようなバッチ処理。

image

3クロックごとに1行を処理するロジックに落ちたみたい。

hls の stream を使ったので、struct の各要素の各ビットを入れる為の pin があるハードウェアが作られた!(ちゃんと構造体がパラメータとして使えてる!)

image

メモリにマップしてそれを読み込んで処理して回るロジックにしてみたりとかは、また今度ですが一応とっかかりとしては普通にCで構造体とか作ってレコード定義してそれ処理して回るハードウェアアクセラレータは普通に作れるようだってところ。

コメントを残す