用于多速率处理的缓冲器端口连接 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

在某些设计中,内核的输出缓冲器端口大小可能与下一个内核的输入缓冲器端口大小不同。在此情况下,连接声明将包含输出端口的大小和输入缓冲器端口的大小。例如:

connect net0 (kernel0.out[0], kernel1.in[0]);
dimensions(kernel0.out[0]) = {128};
dimensions(kernel1.in[0]) = {192};

在以上示例中,kernel0 会写入 128 个样本,kernel1 预计将有 192 个样本写入存储器。在此类情况下,aiecompiler 会执行自动多速率分析。在此情况下,aiecompiler 将指定 kernel1 应运行 2 次,而 kernel0 则运行 3 次。在编译时可在 aiecompiler 命令中使用 --disable-multirate 标志来禁用此自动分析。在此情况下,您必须在计算图中为这些内核指定重复计数,如下所示:

repetition_count(kernel0) = 3;
repetition_count(kernel1) = 2;

正如您能够在计算图中将输出缓冲器端口多播至多个输入缓冲器端口(自动 DMA 插入机制)一样,您也可以在此特定用例中执行多速率处理:

connect net0 ( kernel0.out[0] , kernel1.in[0] );
connect net1 ( kernel0.out[0] , kernel2.in[0] );
dimensions(kernel0.out[0]) = {128};
dimensions(kernel1.in[0])  = {64};
dimensions(kernel2.in[0])  = {192};

在此示例中,aiecompiler 会自动检测出针对每一次计算图迭代 graph.run(1)kernel0 应运行 3 次,kernel1 应运行 6 次,而 kernel2 则应运行 2 次。这些重复计数也可在计算图中手动指定。

以下图形示例演示了合理的上变频器 (7/5) 后接一个单速率内核。两者的输入帧长度均为 350,但上变频器的输出帧长度为 490。
connect ( datain , upconv.in[0] );
connect ( upconv.out[0] , singlerate.in[0] );
connect ( singlerate.out[0] , dataout );

// If the connection is buffer based dimensions can be specified
// in the graph
dimensions(upconv.in[0]) = {350};
dimensions(upconv.out[0])  = {490};
dimensions(singlerate.in[0]) = {350};
dimensions(singlerate.out[0])  = {350};

// If the connections are stream based, repetitions count must be specified
repetition_count(upconv) = 5;      // LCM(350,490)/490 = 5
repetition_count(singlerate) = 7;  // LCM(350,490)/350 = 7
图 1. 上变频器后接单速率内核

在上图中,上变频内核必须运行 5 次,而单速率内核则必须运行 7 次,这样才能在这两个内核之间产生和耗用相同数量的样本。

在此示例中,上变频器的输出帧长度大于单速率内核的输入帧长度。这意味着,上变频器将在单次迭代中写入乒乓缓冲器(或其他更复杂的方案)。