DSP性能,应该避免什么
DSP performance, what should be avoided?
我现在从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
,它计算两个整数src1
和src2
的标量乘积:对于src1
和src2
中的每对8位值,将src1
中的8位值与src2
中的8位值相乘,并将四个乘积相加。
检查DSP的数据表,看看是否可以使用这些操作。
编译器应该生成一个中间文件,您可以对其进行探索,以便分析代码中每个优化的for
循环的预期性能。
基于此,您可以尝试不同的组装操作,这些操作可能会产生更好的结果。
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 不同的类或结构初始化方法之间的性能差异是什么?
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 并行性能不佳的原因是什么?
- 标准库容器最简单、性能差的哈希类是什么?
- 指针和程序性能之间有什么关系吗?
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- 牢记干净的代码的性能,什么更好
- 返回本地静态的函数和返回静态成员的函数之间有什么区别(对象大小、性能等)?
- 与保留模式GUI相比,使用直接模式GUI的性能含义是什么?
- GSL 的预期 (cond) 对运行时施加的性能影响是什么?
- F#性能:是什么让这个代码如此缓慢
- 将特征矩阵转换为 c 数组以便我可以使用 gsl 的性能高效方法是什么
- 链接分配的性能含义是什么
- 造成这种性能差异的原因可能是什么
- 在什么平台上memmove和memcpy可以有显著的性能差异
- 测试操作系统性能时,硬件开销和软件开销有什么区别
- 什么是通过调用_mm_stream_si64x()实现性能提升的示例程序
- 初始化方法与构造函数加赋值的方法——性能有什么不同?(C++)
- 函数指针:从性能的角度来看,简单的规范使用是否不好?如果是这样的话,c++11的替代方案是什么