尽管本期专栏中的大多数文章都讨论图形处理器的重编程问题,但其它大型处理单元阵列也可以作为标准产品IC应用于其它场合。在某些情况下,这些阵列还能被用于原先指定应用之外的功能。
其中一个例子是picoChip PC102,它是一种最初用于无线基础设施的处理阵列。该阵列是一个多指令、多数据架构,设计用于执行无线基站处理等数据算法。本文将介绍如何利用一小部分PC102阵列来实现MPEG音频编码器中所使用的多相位滤波器。
在这种应用中的多相位滤波器将输入信号分割至许多不同的频率槽(frequency bin)。这相对简单,但能提供良好的时间分辨率和合理的频率分辨率,从而允许运用人耳的心理声学模型。
本文将讨论由ISO/IEC 11172-5 MPEG-1、附录C 第3节-C.1.3中定义的子带分析滤波器的实现。
让我们为32个子带输出中的每一个输出设定256个周期的目标吞吐量。假设内核时钟为160MHz,这等于相当可观的16位 x 160 x 106/256 = 10 Mbps吞吐量。
目标吞吐量是一个关键的设计约束条件,并且能从根本上影响整个系统架构。因此,我们首先要把目标吞吐量约束条件施加到处理级上。
每一次操作要进行64次乘-加运算。根据我们256周期的目标吞吐量,我们有256/ 64 = 4个周期来执行每一步乘-加运算。
现在,再根据部分计算结果(Y矢量)来进行子带采样(Si)计算。共有64个Y项要计算,而且每次Si迭代都要进行这些计算。不过,每次迭代可重复使用相同的Y值,因此每隔32 x 256 = 8,192周期需要有一组新的Yk值。
所以,我们能计算出我们必须计算每一个Yk值的周期数,即8,192 / 64 = 128个周期。每个Yk值需要进行8次乘-加运算,故每次乘-加运算要有128 / 8 = 16个周期。
通过引用吞吐量约束条件,我们现在知道:
每128个周期必须提供一个新Yk值,而且我们有16个周期来执行每次乘-加运算。
每256个周期必须提供一个新Si,而且我们有4个周期来执行每次乘-加运算。根据以上分析,所有乘-加处理在理论上都可以放入单个MAC阵列单元中执行。这是因为我们有5:16的乘-加组合比,所需处理能力小于picoArray中MAC阵列单元峰值处理能力的33%。MAC阵列单元有两个累加器,使我们能单独保留Yk及Si的计算结果。
但我们还必须考虑数据存储需求:
Y矢量需要:512 x 16位Ci 系数 = 1k
S矢量需要:2048 x 16位M矩阵 = 4k
Y矢量需要:512 x 16位Xi 输入采样 = 1k
这总计需要6k的数据存储量,明显超过MAC阵列单元256字节的数据存储量。我们没有其他选择,只有使用MEM阵列单元来存储数据。
这使我们采用一种带两个阵列单元的架构。现在,让我们来分析一下将处理任务分割到两个阵列单元上的含义。
请注意,由于MAC阵列单元上没有系数、矩阵及输入采样,故它们必须由外部硬件端口提供。下面我们来计算两个阵列单元之间所要求的通信速率以及需要多少个硬件端口。
从前面对Y吞吐量要求的分析中我们知道,每16个周期需要有一对新的X及C元素。数据采样及系数均为16位,故可采用一个@16时隙速率的硬件端口。此外,从前面对S的分析中我们知道,每4个周期要求有一个新的M元素。每个M元素是16位宽,意味着我们能在一个硬件端口上同时发送两个相邻值。这可能需要@8的时隙速率。
根据端口通信要求,我们现在能将MAC阵列单元上所需的处理进行编码。CalcS实体代码正好在256个周期内执行,管线延时为8,192个周期。从该代码上可观察到以下内容:
在阵列单元中要使用两个累加器,以便对Y及S元素进行单独累积。
代码环已经被解开,以便交替进行Y及S运算,从而满足前面讨论的吞吐量要求。
采用双缓冲方案来存储当前64 x Yi 16位采样(128字节存储器)以及下一个64 x Yi 16位采样。读指针总是滞后于写指针128个字节。
从acc1中读取每个部分Yi结果,而且每次围绕内环将其写入存储器中。因此,只有最后乘-加上所存储的Yi才是正确的。预清空存储器可以免除执行特殊情况检查及存储的需要。
作者:Liam Wickens
高级应用工程师
picoChip公司
京公网安备 11011202001138号
