构建含多个子 graph 的大型 graph 时,有时对内核到 AI 引擎的精确映射(相对于其它内核或者以绝对方式)加以控制是很有用的。AI 引擎编译器提供了相应的机制来为内核指定位置约束,这些位置约束搭配 C++ 模板使用时即可提供强大的机制,以创建从您的 graph 到 AI 引擎阵列的稳健、可扩展且可预测的映射。它还可减少映射器尝试的选项数量,从而使映射器显著提速。以如下 graph 规范为例:
#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_graph1 : public graph {
public:
kernel kr[NUMCORES];
port<input> datain[NUMCORES] ;
port<output> dataout[NUMCORES] ;
indep_nodes_graph1() {
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);
}
}
for (int i = 0; i < NUMCORES; i++) {
connect<stream, window<64> >(datain[i], kr[i].in[0]);
connect<window<64>, stream >(kr[i].out[0], dataout[i]);
}
};
};
模板参数识别出内核的 COLS x ROWS 逻辑阵列 (COLS x ROWS = NUMCORES),该阵列布局在更大的逻辑器件内,此器件维度从原始位置的 (STARTCOL, STARTROW) 处开始。此 graph 中的每个内核都被约束为布局在特定 AI 引擎上。达成方式是对每个内核使用绝对位置约束来将其布局在特定处理器拼块上。例如,以下声明将创建从偏移 (3,2) 开始的 1 x 2 内核阵列。将此内核阵列嵌入 4 x 4 逻辑器件拓扑结构时,它会被约束到右上角。
indep_nodes_graph1<1,2,3,2> mygraph;
重要: 先前版本中使用
location<absolute>(k)
函数来指定内核约束,使用 proc(x,y)
函数来指定处理器拼块位置。这些函数现已被弃用。改用 location<kernel>(k)
来指定内核约束,使用 tile(x,y)
来识别特定拼块位置。如需了解更多信息,请参阅 自适应数据流 graph 规范引用。