インテル® HLS コンパイラー: リファレンス・マニュアル

ID 683349
日付 6/23/2017
Public
ドキュメント目次

1.9.3. hls_bankbits 属性での使用例

コンポーネント・コードにhls_bankbits(b0, b1, ..., bn) 属性を含むことにより、特定のアドレスビットにローカルメモリーをバンクするようにHLSコンパイラーに指示するオプションがあります。

{b0, b1, ... ,bn} 引数はHLSコンパイラーがバンク選択ビットで使用すべきワードアドレス・ビットを参照します。hls_bankbits(b0, b1, ..., bn) 属性を指定することは、バンク数が 2^( バンクビット数 ) と同等であることを意味します。

注: 現在、hls_bankbits(b0, b1, ..., bn) 属性は連続するバンクビットのみをサポートしています。

hls_bankbits 属性の実装例

次のコンポーネント・コードを考察します。

component int bank_arb_consecutive_multidim (int raddr, int waddr, int wdata, int upperdim) {

  int a[2][4][128];

  #pragma unroll
  for (int i = 0; i < 4; i++) {
    a[upperdim][i][(waddr & 0x7f)] = wdata + i;
  }

  int rdata = 0;

  #pragma unroll
  for (int i = 0; i < 4; i++) {
    rdata += a[upperdim][i][(raddr & 0x7f)];
  }

  return rdata;
}

下の図に示すように、このコード例は複数のロード / ストアー命令を生成します。ただし、命令数に対するポート数が不足しているため、ストール可能なアクセスと II の値は 66 になります。

図 12. コンポーネント bank_arb_consecutive_multidim のローカルメモリーへのアクセス

hls_bankbits属性を指定することで、ロード / ストアー命令がローカルメモリーにアクセスする方法を制御できます。変更されたコード例と下の図に示すように、ローカルメモリーaにアクセスするたびに一定のバンク選択ビットを選択すると、ロード / ストアー命令の各ペアはメモリーバンクの 1 つに接続するためのみに必要になります。このアクセスパターンは II の値を 66 から 1 に大幅に減少させます。

component int bank_arb_consecutive_multidim (int raddr, int waddr, int wdata, int upperdim) {

  int a[2][4][128] hls_bankbits(8,7);

  #pragma unroll
  for (int i = 0; i < 4; i++) {
    a[upperdim][i][(waddr & 0x7f)] = wdata + i;
  }

  int rdata = 0;

  #pragma unroll
  for (int i = 0; i < 4; i++) {
    rdata += a[upperdim][i][(raddr & 0x7f)];
  }

  return rdata;
}
図 13. hls_bankbits 属性のコンポーネント bank_arb_consecutive_multidim のローカルメモリーへのアクセス

hls_bankbits属性でワードアドレス・ビットを指定する場合、バンク選択ビットの結果がローカルメモリーへのアクセスごとに一定であることを確認します。下の図に示すように、ローカルメモリーのアクセスパターンは、選択されたバンク選択ビットがアクセスごとに一定であるという保証がないようなものです。結果として、ロード / ストアー命令の各ペアは、すべてのローカルメモリー・バンクに接続する必要があり、ストール可能なアクセスとなります。

component int bank_arb_consecutive_multidim (int raddr,
                                             int waddr,
                                             int wdata,
                                             int upperdim){

  int a[2][4][128] hls_bankbits(5,4);

  #pragma unroll
  for (int i = 0; i < 4; i++) {
    a[upperdim][i][(waddr & 0x7f)] = wdata + i;
  }

  int rdata = 0;

  #pragma unroll
  for (int i = 0; i < 4; i++) {
    rdata += a[upperdim][i][(raddr & 0x7f)];
  }

  return rdata;
}
図 14. hls_bankbits 属性のコンポーネント bank_arb_consecutive_multidim のローカルメモリーへのストール可能なアクセス