我现在开始使用dsp编程,并且正在编写我的第一个低级类和函数。 由于我希望函数快速(或者最后效率不高),我常常想知道在每个样本调用的函数中我应该使用什么以及应该避免什么。
我知道指令的速度变化很大但我认为你们中的一些人至少可以分享经验法则或只是经验。 :)
条件陈述
如果我必须使用条件,switch
应该比if / else if
块快,对吧?
使用两个if
语句或if-else
之间是否存在差异?在某处我读到else
应该避免,但我不知道为什么。
另外,与乘法相比,是否粗略估计if-block需要多长时间?因为在某些情况下,可以使用乘以零而不是if语句:
//something could be an int either 1 or 0:
if(something) {
signal += something_else;
}
// or:
signa+ += something*something_else;
函数和函数指针
您可以使用函数指针,而不是使用条件语句。可以将指针重定向到特定函数,而不是在每次调用中使用条件。但是,对于每次调用,必须解释指针才能调用正确的函数。所以我不知道这是否会有所帮助。
我还想知道调用函数是否会产生影响。如果是这样,应该避免拳击功能,对吗?
变量
我认为在函数中定义和使用许多变量并不会产生影响,至少相对于计算而言。这是真的?如果没有,重用声明的变量将比更多声明更好。
计算
计算类型的顺序是否按照执行时间的顺序排列?我确信这在很大程度上取决于背景,但经验法则很好。我经常读到人们只计算算法中的乘法。这是因为增加的是快速的吗?
乘法和除法之间有区别吗? (*0.5
或/2.0
)
我希望你能分享经验。
干杯
答案 0 :(得分:2)
以下是答案的一部分:
计算(谈论处理器的本机精度,例如32位):
条件陈述:
if / else - 查看汇编代码时,您可以看到if条件的内存通常默认加载,因此在使用if else时,请确保更频繁发生的条件将在if中。
但通常如果可能的话,你应该避免在循环中使用if / else来改善管道衬里。
祝你好运。答案 1 :(得分:1)
DSP编译器通常擅长优化{strong>不包含函数调用的for
循环。
因此,尝试在时间紧迫的for
循环中内联您调用的每个函数。
如果您的DSP是定点处理器,那么浮点运算由SW实现。
这意味着每个这样的操作基本上都被编译器替换为库函数。
所以你基本上应该避免在时间要求严格的for
循环中执行浮点运算。
预处理器应为#pragma
循环的迭代次数提供特殊的for
:
尽可能使用此#pragma
,以帮助编译器尽可能执行循环展开。
最后,DSP通常支持一组独特的操作以提高性能。
例如,考虑Texas Instruments C64xx上的_dotpu4
,它计算两个整数src1
和src2
的标量积:对于每对8位值src1
和src2
,来自src1
的8位值与src2
的8位值相乘,并将这四种产品相加在一起。
检查DSP的数据表,看看是否可以使用这些操作。
编译器应生成一个中间文件,您可以浏览该文件以分析代码中每个优化for
循环的预期性能。
基于此,您可以尝试不同的装配操作,这可能会产生更好的结果。