2014-09-03 66 views
4

我现在开始使用dsp编程,并正在编写我的第一个低级类和函数。 因为我想要的功能是快速的(或最终不是低效的),我经常想知道我应该使用什么,我应该避免在函数中调用每个样本。DSP性能,应该避免什么?

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

条件语句

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

我希望你能分享soem的经验。

干杯

+3

先实施,再优化。也就是说,除非你有工作代码,否则不要担心性能。然后分析您的工作代码并优化瓶颈。 – dohashi 2014-09-03 13:33:49

+1

现在有了复杂的优化编译器,回答这个问题的唯一方法就是告诉你简介。一个编译器通常“知道”如果可以将浮点运算部分转换为乘法运算,并且在现代CPU上使用分支预测等,则很难以一般而有用的方式回答您的问题。 – 2014-09-03 13:34:30

+0

就像我说过的,我不会从算法中挤出纳秒,但是对于设计类和函数,一些基本规则会帮助你。 :) – 2014-09-03 13:36:23

回答

1

DSP编译器通常是善于优化for循环,即包含函数调用。

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

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

这意味着,每一个这样的操作基本上是通过与库函数,编译器代替。

所以,你应该基本上避免内部时间关键for循环执行浮点运算。

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

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

使用此#pragma如果可能的话,以帮助进行环unrol编译如果可能的话。

最后,DSP常常支持一组用于增强性能的独特操作。

作为一个例子,考虑_dotpu4Texas Instruments C64xx,其计算两个整数src1src2的标量积:对于src1src2每对8位的值,从src1的8位值被乘以来自src2的8位值,并且将这四个产品相加在一起。

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

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

此基础上,你可以尝试不同的组装业务,可能产生更好的结果。

+0

耶!另一个在stackoverflow上的C64xx程序员。 – 2014-09-03 14:19:21

+0

@NilsPipenbrinck:哈哈,很高兴认识你:)我认为我是唯一一个离开的人(尽管我承认我最后一次使用它的时间是在2005年左右)。 – 2014-09-03 14:22:49

1

这里是答案的一部分:

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

  • 大多数DSP微处理器具有单周期乘法,这意味着一个 乘法成本究竟与周期相同。
  • 和乘法它通常更快然后除法。

条件语句:

的if/else - 在汇编代码中寻找时,你可以看到使用的if else确保时的记忆,如果条件通常是默认加载,这样的条件,会更频繁地发生在if中。

但通常如果可能的话,你应该避免if/else在循环中改善管道衬里。

好运。

+0

嗨, 这些注意事项也适用于普通的x86/x64 CPU吗?我正在为windows开发,其中DSP指的是“处理器”和“处理”。 :/ – 2014-09-03 14:37:51

+0

这个注释特指DSP – shoham 2014-09-03 14:43:54