ライブラリ コンポーネントを使用するグラフ - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

AI エンジン向けの Vitis ライブラリは、現在 2 つのレベルに分かれています。

レベル 1
基本カーネル
レベル 2
テンプレートでパラメーターを指定した、レベル 1 のカーネルを複数使用するグラフ。次の例には、PL データ ムーバーと、ハードウェアでレベル 2 の関数を使用するホスト コードが含まれています。

この例は、2 つのフィルターを含む DSP ライブラリ (DSPLib) で作成されており、最初のフィルターはシステム全体のスループットを満たすために 5 つのセクションで構築されています。次に、システム設定を示します。

#include <adf.h>
#include "fir_sr_sym_graph.hpp"
#include "fir_interpolate_hb_graph.hpp"

// Filter parameters
#define DATA_TYPE cint16
#define COEFF_TYPE int16

#define FIR_LEN_CHAN 151
#define SHIFT_CHAN 15
#define ROUND_MODE_CHAN 0
#define AIES_CHAN 5 

#define FIR_LEN_HB 43
#define SHIFT_HB 15
#define ROUND_MODE_HB 0

#define WINDOW_SIZE 1024

// Simulation parameters
#define NUM_ITER 8

次に、フィルター サブグラフをインスタンシエートするグラフを示します。

using namespace adf;
namespace dsplib = xf::dsp::aie;

class FirGraph: public graph
{
private:
  // Channel Filter coefficients
  std::vector<int16> chan_taps = std::vector<int16>{
  -17, -65, -35, 34, -13, -6, 18, -22,
  18, -8, -5, 18, -26, 26, -16, -1,
  21, -36, 40, -31, 8, 21, -46, 59,
  -53, 26, 13, -54, 81, -83, 56, -6,
  -54, 102, -122, 101, -43, -38, 116, -164,
  161, -102, 1, 114, -204, 235, -190, 74,
  83, -231, 319, -310, 193, 5, -229, 406,
  -468, 380, -147, -174, 487, -684, 680, -437,
  -10, 553, -1030, 1262, -1103, 474, 596, -1977,
  3451, -4759, 5660, 26983};

  // HalfBand Filter coefficients
  std::vector<int16> hb_taps = std::vector<int16>{
  23, -63, 143, -281, 503, -845, 1364, -2173,
  3557, -6568, 20729, 32767};
  
using channel = xf::dsp::aie::fir::sr_sym::
fir_sr_sym_graph<DATA_TYPE, COEFF_TYPE, FIR_LEN_CHAN, SHIFT_CHAN, ROUND_MODE_CHAN, WINDOW_SIZE, AIES_CHAN>;

using halfband = xf::dsp::aie::fir::interpolate_hb::
fir_interpolate_hb_graph<DATA_TYPE, COEFF_TYPE, FIR_LEN_HB, SHIFT_HB, ROUND_MODE_HB, WINDOW_SIZE>;

public:
  port<input> in;
  port<output> out;

  // Constructor - with FIR graph classes initialization
  FirGraph(){

    channel chan_FIR(chan_taps);
    halfband hb_FIR(hb_taps);

    // Margin gets automatically added within the FIR graph class.
    // Margin equals to FIR length rounded up to nearest multiple of 32 Bytes.
    connect(in, chan_FIR.in[0]);
    connect(chan_FIR.out[0], hb_FIR.in[0]);
    connect(hb_FIR.out[0], out);
  };
};

外部との接続は別のグラフで指定して、このグラフは柔軟に使用できるようにしてあります。

class TopGraph : public graph
{
public:
  input_plio in;
  output_plio out;

  FirGraph F;

  TopGraph()
  {
    in = input_plio::create("128 bits read in",
    adf::plio_128_bits,"data/input_128b.txt", 250);
    out = output_plio::create("128 bits read out",
    adf::plio_128_bits,"data/output_128b.txt", 250);

    connect (in.out[0],F.in);
    connect (F.out, out.in[0]);
  };
};

最後に、シミュレーションの開始に使用するテストベンチを次に示します。

TopGraph LibBasedGraph;

int main(void) {
  LibBasedGraph.init() ;
  LibBasedGraph.run(NUM_ITER) ;
  LibBasedGraph.end() ;
  return 0 ;
}

Vitis IDE では、グラフは次のように表示されます。

図 1. DPSLib グラフ ビュー

このように、chan_FIR は 1 つのグラフにまとめられた 5 つのカーネル (AIES_CHAN = 5) 上に構築され、hb_FIR は自身のサブグラフにあるシングル カーネルに基づいています。

重要: カーネルとサブグラフはグラフ クラスの一部である必要があります。条件付き宣言やポインター ベースの宣言はサポートされていません。同様に、入力および出力ポートもグラフ クラスのメンバーである必要があります。