XMath Walkthrough 简介
xmath_walkthrough 这个项目库是一个实践教程,专为那些希望在 xcore 设备上编写高效的数字信号处理(DSP)或其他计算密集型逻辑的开发者设计。
我们的重点是一个具体的案例:实现一个数字有限脉冲响应(FIR)滤波器。我们首先会用一种非常直观但效率不高的方式来实现滤波器。然后,我们将:
- 探讨各种可以优化这个实现的方法。
- 介绍
lib_xcore_math库中的一些 API,这些 API 可以帮助我们进行优化。 - 并讨论在这个过程中遇到的一些理论和概念性的问题。
教程结构
本教程分为4个部分,每个部分包含3个阶段。所有阶段都实现了相同的FIR滤波器,但使用了不同的方法。
每个阶段:
- 解释了我们使用该实现的动机。
- 介绍了理解该阶段实现所需的任何新概念或背景。
- 介绍了任何新的
lib_xcore_math库调用。 - 解释了阶段特定的实现。
- 讨论了该阶段实现的性能观察。
第1部分 - 浮点数
本部分使用浮点数算术实现了FIR滤波器。浮点数算术是实现数字滤波器的最简单的方法,因为应用程序开发人员不需要过多关注变量的动态范围,并且不需要手动管理指数和头空间的簿记工作。
最终,浮点数算术不会产生最高性能的实现,因为xcore设备只有一个标量浮点单元。
第2部分 - 定点数
本部分使用定点数算术实现了FIR滤波器。一旦应用程序开发人员克服了理解指数和定点表示之间的转换的概念障碍,定点数算术就是浮点数算术的一种方便且快速的替代方法。
定点数算术虽然快速且简单,但也有一些缺点。特别是,因为需要在编译时选择特定的指数和位深度,因此定点值的分辨率和范围也是固定的。在某些情况下,这可能导致精度不足,在其他情况下可能导致溢出或饱和。最终,定点数只在系统的输入值或内部状态不在广泛的动态范围内变化时才是理想的选择。
第3部分 - 块浮点数(BFP)
第三部分使用块浮点数(BFP)算术实现了FIR滤波器。与定点数不同,BFP允许相关对象在尺度上有很大的变化,但与浮点数不同,BFP的底层算术运算是在整数数组上进行的,从而可以加速xcore VPU的计算。
BFP算术的缺点是它需要一些额外的开销来管理向量指数和头空间。管理这些开销可能相当繁琐。在本部分中,我们还将看到lib_xcore_math的BFP API将为我们简化大部分这些簿记工作。
第4部分 - 杂项
第4部分中的每个阶段都涉及一些相关的感兴趣的主题,例如跨核心并行化工作以及使用lib_xcore_math提供的数字滤波器API。
阶段
| 部分 | 阶段 | 详细信息 |
|---|---|---|
| 浮点数 | 第1A部分 | 双精度;纯C |
| 第1B部分 | 单精度;纯C | |
| 第1C部分 | 单精度;lib_xcore_math向量API | |
| 定点数 | 第2A部分 | 纯C中的定点数 |
| 第2B部分 | 优化的汇编;仅标量单元 | |
| 第2C部分 | lib_xcore_math向量API | |
| BFP | 第3A部分 | 纯C中的块浮点数 |
| 第3B部分 | lib_xcore_math向量API | |
| 第3C部分 | lib_xcore_math BFP API | |
| 杂项 | 第4A部分 | 多线程BFP |
| 第4B部分 | lib_xcore_math数字滤波器API | |
| 第4C部分 | lib_xcore_math滤波器生成脚本 |