直接用 C 或汇编编写 DSP 算法?

电器工程 C 微处理器 信号处理 集会 数字信号处理器
2022-01-05 19:22:09

我正在使用 ADI 数字信号处理器(BF706)上的 DSP 项目(IIR 滤波),并附带编译器套件 CrossCore Studio。它有一些简单的 DSP 示例,例如 FIR 和 IIR 滤波器以及它的库函数。处理器手册描述了汇编指令集,没有评论 C。

我的问题来自这个特定的应用程序,但我认为 DSP 开发人员遵循最佳实践。所以我会用一般的方式来框定它:

我从这个 DSP 附带的示例中意识到,如果我想使用为 DSP 应用程序设计的电路,我需要在汇编中编程以直接运行这些指令。(如乘法和加法等)我的问题是我只是用C编程,编译器(也来自DSP芯片公司)不会为那个DSP优化它并使用它的功能吗?还是我真的需要直接在汇编中编写 DSP 例程?

4个回答

如果编译器编写者为该目标付出一些努力来优化它,它至少会利用一些特殊的 DSP 指令/架构。但对于终极性能而言,它永远不会像手动调整的装配那样好。不过,它可能已经足够好了 - 取决于您的应用程序。

其他替代方案包括:

  1. 用 C 语言编写程序的大部分,以及汇编中最关键的数字部分。
  2. 用 C 语言编写程序并使用制造商或第三方提供的库 - 如果您正在执行常见的 DSP 任务,例如 FFT、FIR/IIR 滤波器等,可能有人已经编写了手动调整的机器代码来执行此操作,所以您可以使用它(您可能需要付费)并将其链接到您的应用程序。

用高级语言(C 与汇编相比)实现算法总是更好,即使您计划最终用汇编实现所有内容。

  • 机会是,你甚至不需要组装如果您的编译器生成的代码符合您的设计目标,那么您的工作就完成了。

  • 如果没有,您将不会从头开始进行汇编编码让编译器为您生成初始代码,并将其用作优化汇编版本的基础。

  • 稍后,当您需要测试优化的汇编代码时,您会很高兴拥有 C 版本。无需手动计算测试输入数据的正确输出,您只需将该输入数据提供给未优化的 C 实现,然后检查程序集在您进行优化后是否产生完全相同的输出。

如果几年后新开发人员需要对您的算法进行修改,而他们手头只有高度优化的汇编代码,那么他们很有可能必须从头开始。

过早的优化是万恶之源。——唐纳德·克努斯

当你发现你的代码没有得到足够的性能时,首先分析你的程序,找到瓶颈,分析你的性能需求,然后才开始做优化。编写汇编代码是最后的手段。

我的问题是,如果我只是用 C 语言编程,编译器(也来自 DSP 芯片公司)不会针对该 DSP 优化它并使用它的功能吗?

是的,C 编译器可以进行大量优化。但这取决于编译器的质量。通常,人类可以编写比编译后的 C 代码更快的汇编代码。以人类的痛苦和苦难为代价,就是这样。

还是我真的需要直接在汇编中编写 DSP 例程?

首先用 C 编写,然后是 profile,然后决定是否需要用汇编编写。希望您不需要该程序集。

假设所有管道都已填满,您的 DSP 将以最大持续 MAC 为广告。这显然是可以实现的上限。从您的分析中,您知道您的过滤器和其他处理将需要多少 MAC。目标是使第一个至少两倍于第二个,因为您将无法使 DSP 内核保持最大运行。就像您不会尝试将 FPGA 资源填充到 70% 以上(超过该值时 PAR 变得非常慢),尝试从 DSP 中挤出最后几个理论上的 MAC 可能会变得非常缓慢。

您将用 C 编写整个应用程序。在汇编程序、测试注入和可见性、内务管理等中编写所有额外的必要内容是不切实际的。编写测试过滤器的 C 版本。编写相同过滤器的汇编程序版本,以验证您实际上可以为这个野兽编写汇编程序。

现在做一些计时。使用供应商认可的 RTOS。将测试汇编器模块的运行时间与 C 版本进行比较。如果它们在百分之几之内,请继续。如果是三倍,那么请阅读文档,询问供应商,并找出编译器没有调整它的原因。您可能需要学习编写它的 C 风格以及设置正确的编译器标志,与在汇编程序中重写所有内容相比,找出如何正确驱动编译器会更快。

在提交到 DSP 和工具链之前,您已经完成了所有这些工作。

一旦你有了一个可以使用的工具链,一个你可以调整到合理接近最大值的编译器,一个留有一些时序裕量的 DSP,那么你就可以有理由相信你的代码套件的很少部分需要放入装配工完成这项工作。