DSP性能,应该避免什么

DSP performance, what should be avoided?

本文关键字:什么 性能 DSP      更新时间:2023-10-16

我现在从dsp编程开始,正在编写我的第一个低级别类和函数。由于我希望函数快速(或者最终不低效),我经常想知道在每个样本调用的函数中应该使用什么以及应该避免什么。

我知道指令的速度变化很大,但我认为你们中的一些人至少可以分享经验法则或经验。:)

条件语句

如果我必须使用条件,switch应该比if / else if块快,对吧?使用两个if-语句和一个if-else语句之间有区别吗?我在某个地方读到应该避免else,但我不知道为什么。

此外,与乘法相比,是否有一个粗略的估计,一个if块需要多长时间?因为在某些情况下,可以使用乘以零来代替if语句:

//something could be an int either 1 or 0:
if(something) {
    signal += something_else;
}
// or:
signa+ += something*something_else;

函数和函数指针

您可以使用函数指针,而不是使用条件语句。指针可以重定向到特定的函数,而不是在每次调用中都使用条件。然而,对于每次调用,都必须对指针进行解释,以便调用正确的函数。所以我不知道这是否有帮助。

我还想知道调用函数是否会产生影响。如果是这样的话,应该避免装箱功能,对吧?

变量

我认为在一个函数中定义和使用许多变量并没有真正的影响,至少相对于计算来说是这样。这是真的吗?否则,重用已声明的变量会比多声明要好。

计算计算类型的执行时间是否有顺序?我确信这在很大程度上取决于上下文,但经验法则会很好。我经常读到,人们在算法中只计算乘法。这是因为添加速度真的很快吗?乘法和除法有区别吗?(*0.5/2.0

我希望你能分享一些经验。

干杯

以下是部分答案:

计算(谈论处理器的原生精度,例如32位):

  • 大多数DSP微处理器都有单周期乘法器,这意味着就周期而言,乘法的成本与加法的成本完全相同
  • 乘法通常比除法快

条件语句:

if/else-当查看汇编代码时,你可以看到if条件的内存通常是默认加载的,所以当使用if/elses时,请确保更频繁发生的条件将在if.中

但一般来说,如果可能的话,你应该避免if/else循环,以改善管道内衬。

祝你好运。

DSP编译器通常擅长优化不包含函数调用的for循环。

因此,请尝试在时间关键的for循环中内联您调用的每个函数。

如果DSP是定点处理器,则浮点运算由SW实现。

这意味着每一个这样的操作本质上都被带有库函数的编译器所取代。

因此,基本上应该避免在时间关键的for循环中执行浮点运算。

预处理器应该为for循环的迭代次数提供一个特殊的#pragma

  • 最小迭代次数
  • 最大迭代次数
  • 迭代次数的倍数

尽可能使用此#pragma,以帮助编译器尽可能执行循环展开。

最后,DSP通常支持一组独特的操作以提高性能。

例如,考虑Texas Instruments C64xx上的_dotpu4,它计算两个整数src1src2的标量乘积:对于src1src2中的每对8位值,将src1中的8位值与src2中的8位值相乘,并将四个乘积相加。

检查DSP的数据表,看看是否可以使用这些操作。

编译器应该生成一个中间文件,您可以对其进行探索,以便分析代码中每个优化的for循环的预期性能。

基于此,您可以尝试不同的组装操作,这些操作可能会产生更好的结果。