広帯域幅メモリ (または HBM) は、デザイン内で配列を異なるバンク/擬似チャネルに分割することにより、広帯域幅を提供します。これは、高パフォーマンスの計算で配列を異なるメモリ領域に分割する場合によく使用される方法です。ハードウェアとやり取りするソフトウェア アプリケーションは、1 つのバッファーを割り当てます。これが疑似チャネルに広がります。
さまざまな引数で依存解析をイネーブル
Vitis HLS は異なるポインターを独立したチャネルと判断し、依存解析を削除します。ただし、ソフトウェア アプリケーションは両方のポインターに 1 つのバッファーを割り当てます。これにより、ツールが pragma HLS
ALIAS
を使用して依存解析を維持できます。ALIAS プラグマは、ポインターの距離に関するデータ依存解析を通知します。詳細は、ALIAS プラグマまたは指示子を参照してください。
次のコード例では、
arg0
カーネルが bank0
に、arg1
カーネルが bank1
に割り当てられています。ポインターの距離は、次のように ALIAS プラグマの distance
オプションで指定する必要があります。//Assume that the host code looks like this:
int *buf = clCreateBuffer(ctxt, CL_MEM_READ_ONLY, 2*bank_size, ...);
clSetKernelArg(kernel, 0, 0x20000000, buf); // bank0
clSetKernelArg(kernel, 1, 0x20000000, buf+bank_size); // bank1
//The ALIAS pragma informs data dependence analysis about the pointer distance
void kernel(int *bank0, int *bank1, ...)
{
#pragma HLS alias ports=bank0,bank1 distance=bank_size
ALIAS プラグマは、次のいずれかの形式を使用して指定できます。
- 定数の距離:
#pragma HLS alias ports=arr0,arr1,arr2,arr3 distance=1024
- 変数の距離:
#pragma HLS alias ports=arr0,arr1,arr2,arr3 offset=0,512,1024,2048
制約:
- インターフェイス プラグマ内のすべてのポートの深さは同じである必要があります。
- すべてのポートが異なるバンドルに割り当てられ、異なる HBM コントローラーにバインドされている必要があります。
-
2 番目の形式で指定されるポート数は、指定されたオフセット数 (ポートごとに 1 つのオフセット) と同じである必要があります。
#pragma HLS interface offset=off
はサポートされません。 - 各ポートは、1 つの ALIAS プラグマでのみ使用できます