インテル®高位合成 (HLS) コンパイラー プロ・エディション: ベスト・プラクティス・ガイド

ID 683152
日付 12/16/2019
Public
ドキュメント目次

3.1.5. 値渡しインターフェイス

CPUをターゲットとするコードの記述に慣れているソフトウェア開発者にとっては、配列内の各要素を値で渡すことは、直感的ではないかもしれません。これは、一般的に、多くの関数呼び出しや大きなパラメーターをもたらすからです。しかし、FPGAをターゲットとするコードでは、配列要素を値渡しすることでFPGA上のハードウェアをより小さくよりシンプルなものにすることができます。

ベクトル加算のコンポーネント例を次のようにコーディングして、ベクトルの配列要素を値渡しします。struct を使用するのは、配列全体 (データ要素8個) を値渡しする必要があるためです。
struct int_v8 {
  int data[8];
};
component int_v8 vector_add(
    int_v8 a,
    int_v8 b) {
  int_v8 c; 
  #pragma unroll 8
  for (int i = 0; i < 8; ++i) {
    c.data[i] =   a.data[i]  
                + b.data[i];
  }
  return c;
}

このコンポーネントでは、ベクトル a とベクトル b の8要素のみを受け取って処理し、ベクトル c の8要素を返します。例の1024要素を計算するには、コンポーネントのコールが128回 (1024/8) 必要です。前述の例ではコンポーネントのループがパイプライン処理されましたが、この例ではコンポーネント・コールがパイプライン処理されます。

次の図で示すGraph ViewerのFunction Viewは、この例をコンパイルしたときに生成されるものです。
図 5. 値渡しインターフェイスでの vector_add コンポーネントのGraph Viewer Function View


このコンポーネントのレイテンシーは1です。また、ループ開始間隔 (II) は1です。
このコンポーネントのコンパイルは、 インテル® Quartus® Primeのコンパイルフローを使用して インテル® Arria® 10バイスをターゲットとする場合、その結果は次のQoR メトリックになります。
表 6.  値渡しインターフェイスでの QoR メトリックの比較1
QoR メトリック ポインター Avalon® MMマスター Avalon® MMスレーブ Avalon® ST 値渡し
ALM 15593.5 643 490.5 314.5 130
DSP 0 0 0 0 0
RAM 30 0 48 0 0
fMAX (MHz)2 298.6 472.37 498.26 389.71 581.06
レイテンシー (サイクル) 24071 142 139 134 128
開始間隔 (II) (サイクル) ~508 1 1 1 1
1QoRメトリックの計算に使用されたコンパイルフローでは、インテル Quartus Prime プロ・エディションのバージョン17.1を使用しています。
2fmax の測定値は1シードから計算しています。
値渡しインターフェイスでの vector_add コンポーネントのQoRメトリックで示されているとおり、少量のALMが使用され、コンポーネントのfMAX は高く、レイテンシーおよびII値は最適です。この場合、IIはコンポーネントの呼び出し間隔と同じです。コンポーネントの新しい呼び出しの起動は、クロックサイクルごとに行われます。開始間隔が1の場合、128回のコンポーネント・コールが128サイクルで実行されるため、合計レイテンシーは128になります。