HBM でのマルチ ポート アクセスのプログラミング モデル - 2023.2 日本語

Vitis 高位合成ユーザー ガイド (UG1399)

Document ID
UG1399
Release Date
2023-12-18
Version
2023.2 日本語

広帯域幅メモリ (または 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 プラグマでのみ使用できます