附录:性能信息
附录:性能信息
本附录提供了与特定感兴趣场景的额外性能信息。这些案例不太适合放在教程的主体部分,但这些信息很可能会有用。从概念角度来讲,这些案例没有进行深入讨论。文档中会提到实现这些案例的代码,但具体的代码分析留给读者自行完成。
用于测量性能的应用程序很小,仅依赖于lib_xcore_math(与第1至4部分的代码没有共享)。
浮点数FIR滤波器,另一种方法
在第1B部分和第1C部分中,我们研究了FIR滤波器的全浮点数实现。本节直接比较了经过优化的全浮点数实现与使用lib_xcore_math的32位数字滤波器API,并使用float包装器将输入从float转换为定点数进行滤波,然后将输出再转换回float的性能。(与第1C部分相反)。
这里使用的“包装”方法仍然对输入和输出样本块进行操作,因为这样可以比逐个样本转换更高效地进行转换。
由于涉及浮点逻辑的代码路径对数据值很敏感,因此使用了随机滤波器权重和输入数据。
本应用程序中创建的滤波器阶数范围从64个抽头到1024个抽头。
FIR结果
以下各节介绍了运行应用程序时的测量结果。在所有情况下,设备的核心时钟频率为600 MHz。
下面图表中的数据是使用xcore内置的100 MHz参考时钟测量的时间。这些测量数据取决于一些细节,包括代码在内存中的放置位置、编译器优化级别等。在实际应用中,性能可能会有所不同。
特别是,我发现在filter_wrapped.c文件中对filter_wrapped()函数进行相对较小的更改可能会导致性能有几个百分点的差异。
样本处理性能

上图比较了每种实现的每个输出样本处理时间(以微秒为单位)与抽头数的关系。"Float"系列是纯浮点数实现,"Wrapped"是使用浮点数包装器的定点数FIR滤波器。如预期的那样,两种实现的时间成本都与抽头数线性增加。纯浮点数实现的每个滤波器抽头的成本增加得更快。
根据计算每个输出样本的时间,我们可以取其倒数,得到每种实现在实时系统中能够处理的最大样本率。

这里描述的最大样本率假设只使用单个线程来处理实时输入流的滤波。通过使用多个硬件核心或 Tile ,仍然可以处理更高的实时样本率。
当抽头数增加时,最大样本率自然会降低。然而,由于随着抽头数增加,包装实现变得相对更高效,对于较大的滤波器来说,它可以处理比浮点数实现更高的样本率。
下图显示了"Float"样本时间与"Wrapped"样本时间的比值,更明确地进行了比较。
