【问题标题】:DSP performance, what should be avoided?DSP性能,应该避免什么?
【发布时间】:2014-10-28 00:51:59
【问题描述】:

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

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

条件语句

如果我必须使用条件,switch 应该比if / else if 块快,对吧? 使用两个if-statements 或一个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

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

干杯

【问题讨论】:

  • 先实施,后优化。也就是说,在你有工作代码之前不要担心性能。然后分析您的工作代码并优化瓶颈。
  • 如今,对于复杂的优化编译器,回答这个问题的唯一真正方法是告诉您进行分析。如果可以的话,编译器通常“知道”将浮点除法转换为乘法,并且在现代 CPU 上使用分支预测等,很难以通用、有用的方式回答您的问题。
  • 就像我说的,我不会开始从我的算法中挤出纳秒,但对于设计类和函数,一些基本规则会很有帮助。 :)
  • 如果您想知道我为什么要问这个问题,我在这里有一个示例:我有一个执行基本双二阶计算的双二阶函数。我可能不想更改过滤器以使用 24db/octave 而不是 12db/octave 进行截止。因此,在双二阶函数中,我会创建一个条件,如果设置了 24db-bool,则样本会被另一个双二阶实例过滤。这个if-statement 会产生影响还是与一般的双二阶计算(五次乘法,一些加法和赋值)相比“便宜”
  • 您也可以考虑使用现有的库或框架,而不是重新发明一切(除非目的只是为了学习)。比较可以找到here

标签: c++ performance signal-processing


【解决方案1】:

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

因此,请尝试内联您从时间紧迫的 for 循环中调用的每个函数。

如果您的 DSP 是定点处理器,那么浮点运算由 SW 实现。

这意味着每个这样的操作本质上都被编译器替换为库函数。

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

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

  • 最小迭代次数
  • 最大迭代次数
  • 迭代次数的多重性

在可能的情况下使用此#pragma,以帮助编译器在可能的情况下执行循环展开。

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

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

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

编译器应生成一个中间文件,您可以浏览该文件以分析代码中每个优化的for 循环的预期性能。

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

【讨论】:

  • 耶! stackoverflow 上的另一个 C64xx 程序员。
  • @NilsPipenbrinck:哈哈,很高兴认识你 :) 我以为我是唯一剩下的人(尽管我不得不承认我上次使用它是在 2005 年左右)。
【解决方案2】:

以下是部分答案:

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

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

条件语句:

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

但通常,如果可能,您应该避免 if/else 在循环中以改善管道内衬。

祝你好运。

【讨论】:

  • 嗨,这些注释是否也适用于普通的 x86/x64 CPU?我正在为 Windows 开发,完全忘记了 DSP 指的是“处理器”和“处理”。 ://
  • 本说明专指做DSP
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多