システム アーキテクチャとアクセラレータ アーキテクチャは、VPP_ACC
クラスから派生したアクセラレータ クラスを使用して完全に指定できます。このコード例では、たたみ込みフィルター システムのアーキテクチャ、計算の構成、CU 数、および計算の接続が conv_acc
クラスにより完全に定義されています。次のシステム アーキテクチャが生成されます。
図 1. ハードウェア アーキテクチャ
conv_acc
クラスは、compute()
関数内でラップすることで krnl_conv()
関数がアクセラレーションするように指定します。ビデオには、同じ機能を使用して個別に処理できる 3 つの異なるカラー チャネルがあるため、このアクセラレータ クラスで 3 つの CU を使用するようにも指定されます。これらの CU は、データ ACCESS_PATTERN
マクロで指定されたデータ ムーバーを使用して複製され、メモリ システムにプラグされます。図のホスト側では、VSC から下位レベル ランタイム ドライバーを使用してハードウェアとやり取りする受信スレッド用と送信スレッド用の 2 つの個別スレッドを示しています。
CU 機能は、別の .cpp ファイルで compute()
関数を使用して定義する必要があります。この例では、プロセッシング エレメント (PE) が 1 つしかないため、compute()
は単にそれをラップします。次のコード部分は、.cpp ファイルの一部とサブ関数の詳細 (ここでは省略) を示しています。詳細な例については、サポートされるプラットフォームとスタートアップの例 を参照してください。
// the compute() function wraps the processing function in this example
void conv_acc::compute(
char *coeffs,
float factor,
short bias,
unsigned short width,
unsigned short height,
unsigned char *src,
unsigned char *dst)
{
krnl_conv(coeffs,factor,bias,width,height,src,dst);
}
// ... the processing function implements the CU functionality
void conv_acc::krnl_conv(
char *coeffs,
float factor,
short bias,
unsigned short width,
unsigned short height,
unsigned char *src,
unsigned char *dst) {
#pragma HLS DATAFLOW
hls::stream<window,3> window_stream; // Set a stream depth to 3
// Read incoming pixels and form valid HxV windows
Window2D(width, height, src, window_stream);
// Process incoming stream of pixels, and stream pixels out
Filter2D(width, height, factor, bias, coeffs, window_stream, dst);
}