TI DSP编程 - C足够快还是需要汇编程序?

时间:2009-09-21 09:56:23

标签: assembly performance signal-processing texas-instruments davinci

我打算为德州仪器DaVinci平台编写一些图像处理程序。有适合C语言编程的工具,但我想知道是否真的可以在不使用汇编语言的情况下充分利用DSP处理器。你知道在这个DSP平台上用C语言编写的程序和汇编程序之间的速度比较吗?

8 个答案:

答案 0 :(得分:11)

我已经使用了其他一些TI DSP,而C通常很好。通常的方法是首先在C中编写所有内容,然后分析代码以查看是否需要手动优化任何内容。

您也可以经常在C中进行优化,通过调整C代码直到获得所需的汇编输出。了解DSP的工作原理以及工作方式的更快或更慢非常重要。

答案 1 :(得分:10)

OMAP3上用于C64x / C64x + DSP的TI编译器支持TI称之为“内在”函数调用的内容。它们不是真正的函数调用,它们只是一种告诉编译器用于可能无法在C中直接表达的操作的汇编操作码的方法。它对于利用C64x / C64x + DSP中的SIMD操作码特别有用。下进行。

一个例子可能是:

A = _add2(B,C);

此SIMD指令将B和C的低/高16位加在一起,并将结果存储在A的低/高16位。您无法在常规C中表达这一点,但您可以使用内部函数来表达C操作码。

我已经使用内在的C来完全接近使用完整的汇编语言(在5-10%之内)。它对于过滤和运动补偿等视频功能特别有用(_dotpsu4!)。

我通常使用-al开关进行编译并查看管道以尝试识别哪些功能单元过载,然后查看我的内在函数以查看是否可以重新平衡循环(如果我使用的S单元过多,我可能会看到我是否可以将操作码更改为使用M单位。)

此外,记住C64x DSP有64个寄存器是有帮助的,因此加载局部变量并且 从不 将指令的输出分配回同一个变量 - 它会对编译器正确管道化的能力产生负面影响。

答案 2 :(得分:7)

通常C是个好地方。您可以快速了解整体框架和算法,并编写大部分在真实数学之间移动数据的管道。一旦到位并且您对数据结构正确感到高兴,您可以在分析器中查看并找出需要手动挤压的例程。

答案 3 :(得分:6)

C编译器(据我测试)没有充分利用该架构。

但是你可以逃脱它,因为DSP可能足够快,可以完成你需要做的操作。

所以它归结为测试和分析你的代码,以查看必须加快的部分,以使系统工作。

答案 4 :(得分:2)

取决于C编译器和“足够快”的定义。标准C编译器通常很难有效地使用特殊的DSP硬件,例如:

  • 可以是多个存储库 并行访问
  • 固定点数据类型
  • 循环缓冲区

答案 5 :(得分:2)

速度的简单比较意味着什么。绝对是c如果比汇编程序更方便。您必须测量系统的时间成本,如果c代码满足您的速度要求,则不必使用汇编程序。如果速度不够,您可以分析代码,找出最耗时的源代码,如循环代码,然后对其进行优化!

答案 6 :(得分:1)

我会坚持使用C,直到我知道有一个热点可以从汇编编码中受益。 This is the "profiling" method I use.您可能会感到惊讶的是,有些方法可以加速非热点的代码,而是可以删除的中间函数调用。

答案 7 :(得分:0)

使用-O3优化进行编译。非常强大。
如果这还不够好,您可以根据自己的喜好进一步优化生成的汇编代码,而不用从头开始在ASM中编写所有代码。