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 つのバッファーを同じアドレス オフセットにマップすることはできません。