たたみ込みフィルターのモデリング - 2023.2 日本語

Vitis 統合ソフトウェア プラットフォームの資料: アプリケーション アクセラレーション開発 (UG1393)

Document ID
UG1393
Release Date
2023-12-13
Version
2023.2 日本語

このセクションでは、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 のどのカーネル モデルも指定する必要があるその他の重要な項目もいくつか定義されます。