バッファーのロケーション制約 - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

AI エンジン コンパイラでは、バッファー、ルックアップ テーブル、およびランタイム パラメーターに、バッファーが可能な限り効率的な方法で自動的に割り当てられます。ただし、メモリでのその配置を明示的に制御する必要があることもあります。このセクションで先ほど示したカーネルと同様に、カーネル ポートに推論されるバッファーを、次の例に示すように、ロケーション制約を使用して特定のタイル、バンク、またはアドレス オフセットに制約できます。

#include <adf.h>
#include "kernels.h"
#define NUMCORES (COLS*ROWS) 
using namespace adf;

template <int COLS, int ROWS, int STARTCOL, int STARTROW>
class indep_nodes_graph2 : public graph {
 public:
   kernel kr[NUMCORES];
   port<input> datain[NUMCORES] ;
   port<output> dataout[NUMCORES] ;
  
 indep_nodes_graph() {
  for (int i = 0; i < COLS; i++) {
    for (int j = 0; j < ROWS; j++) {
      int k = i*ROWS + j;
      kr[k] = kernel::create(mykernel);
      source(kr[k])  = "kernels/kernel.cc";
      runtime<ratio>(kr[k]) = 0.9;
      location<kernel>(kr[k]) = tile(STARTCOL+i, STARTROW+j); // kernel location
      location<buffer>(kr[k].in[0]) = 
        { address(STARTCOL+i, STARTROW+j, 0x0), 
          address(STARTCOL+i, STARTROW+j, 0x2000) };          // double buffer location
      location<stack>(kr[k]) = bank(STARTCOL+i, STARTROW+j, 2); // stack location
      location<buffer>(kr[k].out[0]) = location<kernel>(kr[k]); // relative buffer location
    }
  }

  for (int i = 0; i < NUMCORES; i++) {
    connect(datain[i], kr[i].in[0]);
    connect(kr[i].out[0], dataout[i]);
  }
 };
};

上記のコードでは、kr[k].in[0] ポートのダブル バッファーの位置は、address(col,row,offset) コンストラクターを使用して作成された、特定のメモリ タイル アドレス オフセット制約されています。また、カーネル インスタンス kr[k] を実行するプロセッサのシステム メモリ (同期バッファー、スタックおよびスタティック ヒープを含む) の位置は、bank(col,row,bankid) コンストラクターを使用して特定のバンクに制約されています。kr[k].out[0] ポートに接続されているバッファーの位置は、カーネル インスタンス kr[k] と同じタイルに制約されています。バッファーのロケーション制約は、カーネル バッファー ポートに適用されます。

2 つ目の例は、バッファー制約 (ピンポン バッファー用) を制約ファイルに追加する方法を示しています。この制約ファイルはaiecompiler--constraints オプションで使用できます。
{
  "PortConstraints": {
    "gr.k[0].in[0]": {
      "buffers": [{
          "column": 16,
          "row": 1,
          "bankId": 0,
          "offset": 16320
        }, {
          "column": 16,
          "row": 1,
          "bankId": 3,
          "offset": 0
        }]
    }
  }
}
グラフの RTP ポートがある場合、オプションで次のように制約できるセレクター ワードが追加されます (ピンポン バッファーおよびセレクター ワード用)。
{
  "PortConstraints": {
    "gr.fir24.in[1]": {
      "buffers": [{
          "column": 17,
          "row": 1,
          "bankId": 0,
          "offset": 16320
        }, {
          "column": 17,
          "row": 1,
          "bankId": 3,
          "offset": 0
        }, {
          "column": 18,
          "row": 1,
          "bankId": 0,
          "offset": 16224
        }]
    }
  }
}
重要: ロケーション制約コンストラクターおよびそれらの間に等価関係を使用することにより、コンパイラが従う必要のある詳細なマップを指定できます。ただし、コンパイラで満たすことができない制約を作成しないように注意する必要があります。たとえば、2 つのバッファーを同じアドレス オフセットにマップすることはできません。