このセクションでは、VSC を使用してたたみ込みフィルターをモデリングする方法について、インプリメンテーション自体の詳細なレベルではなく、概要レベルを中心に説明します。トップ レベルでは、CU は 3 つの 8 ビット ポインター (char*
) から入力データと出力データのカラー値、およびフィルター係数を使用してメモリ インタフェースを持つようにモデリングされます。バイアス、画像の高さ、画像の幅など、その他の定数パラメーターも CU に渡されます。
conv_acc_filter.hpp ヘッダー ファイルでは、ホスト コードとソフトウェアの対話に使用される compute()
ラッパー関数 1 つと、1 つ以上のプロセッシング エレメント (PE) を宣言します。この例では、krnl_conv
という名前の PE が 1 つだけあります。
VSC では、すべてのアクセラレータを VPP_ACC
ベース
クラスから派生したクラスとして記述する必要があります。ユーザー コードでは、VPP_ACC
クラスを継承するすべてのクラスが、ハードウェアにコンパイルされるアクセラレータになるようにする必要があります。具体的には、次の例に示すように、子クラスが、compute()
という関数 (コンパイルされたハードウェアアクセラレータへのソフトウェア エントリ ポイント)
を提供する必要があります。すべての派生クラスには、独自の名前を付けて、独自の演算ユニット関数を表す必要があります。
#pragma once
#include "common.hpp"
#include "vpp_acc.hpp"
class conv_acc : public VPP_ACC<conv_acc, /*NCU*/3>
{
ACCESS_PATTERN(src,SEQUENTIAL);
ACCESS_PATTERN(coeffs, SEQUENTIAL);
ACCESS_PATTERN(dst, SEQUENTIAL);
// Data copy macros : specifies that size of data to be copied for kernel call in
// case the kernel can process variable size data.
DATA_COPY(src, src[width*height]);
DATA_COPY(coeffs, coeffs[FILTER_V_SIZE*FILTER_H_SIZE]);
DATA_COPY(dst, dst[width*height]);
// Kernel DDR connections
SYS_PORT(coeffs, DDR[0]);
SYS_PORT(src, DDR[0]);
SYS_PORT(dst, DDR[0]);
public:
static void compute(
char *coeffs,
float factor,
short bias,
unsigned short width,
unsigned short height,
unsigned char *src,
unsigned char *dst
);
static void krnl_conv(
char *coeffs,
float factor,
short bias,
unsigned short width,
unsigned short height,
unsigned char *src,
unsigned char *dst
);
};
このヘッダー ファイルでは、CU の最上位インターフェイスを含め、さまざまなものを定義します。このファイルでは、2 つのスタティック関数 (compute()
および krnl_conv()
) を宣言します。compute()
関数は、CU (ここでは conv_acc
クラス) にデータを送信する send_while
スレッドから呼び出されるホスト側のソフトウェア エントリ ポイントとして機能します。krnl_conv()
関数は、CU のすべての機能をインプリメントします。
ヘッダー ファイルには、VSC のどのカーネル モデルも指定する必要があるその他の重要な項目もいくつか定義されます。