我打算为德州仪器达芬奇平台编写一些图像处理程序。有适合用 C 语言编程的工具,但我想知道是否真的可以在不求助于汇编语言的情况下充分利用 DSP 处理器。你知道在这个 DSP 平台上用 C 和汇编程序编写的程序之间的速度比较吗?
8 回答
我用过一些其他的 TI DSP,C 通常很好。通常的方法是首先用 C 编写所有内容,然后分析代码以查看是否需要手动优化。
您通常也可以在 C 中进行优化,方法是调整 C 代码,直到获得所需的汇编输出。了解 DSP 的工作原理以及哪些工作方式更快或更慢是很重要的。
OMAP3 上用于 C64x/C64x+ DSP 的 TI 编译器包括对 TI 所谓的“内在”函数调用的支持。它们并不是真正的函数调用,它们只是一种告诉编译器使用什么汇编操作码进行可能无法在 C 中直接表达的操作的方法。它对于利用 C64x/C64x+ DSP 中的 SIMD 操作码特别有用C。
一个例子可能是:
A = _add2(B, C);
此 SIMD 指令将 B 和 C 的低/高 16 位相加,并将结果存储在 A 的低/高 16 位中。您无法在常规 C 中表达这一点,但您可以使用固有的 C 操作码来做到这一点。
我已经使用内部 C 来非常接近你可以用成熟的汇编语言做的事情(在 5-10% 之内)。它对于过滤和运动补偿 (_dotpsu4!) 等视频功能特别有用。
我通常使用 -al 开关进行编译并查看管道以尝试识别哪些功能单元被重载,然后查看我的内在函数以查看是否可以重新平衡循环(如果我使用了太多的 S 单元,我可能会看到如果我可以更改操作码以使用 M 单元)。
此外,记住 C64x DSP 有 64 个寄存器也很有帮助,因此请加载局部变量,切勿将指令的输出分配回同一个变量——这将对编译器正确流水线的能力产生负面影响。
通常 C 是一个很好的起点。您可以快速摆脱整体框架和算法,并编写在真实数学之间移动数据的大部分管道。一旦到位并且您很高兴您的数据结构是正确的,您可以在分析器中查看并确定哪些例程需要手动压缩。
C 编译器(据我测试)没有充分利用架构。
但是您可以侥幸逃脱,因为 DSP 可能足够快,可以完成您需要执行的操作。
因此,它归结为测试和分析您的代码,以查看必须加速以使系统工作的部分。
the simple compare of the speed means nothing. Definitely c if more convenient than assembler. You must measure the cost of time of your system, if c code satisfy your require for speed ,you don't have to use assembler. If the speed is not enough, you can profile your code ,find out the most time consuming source code such as loop code, then optimize it!
取决于 C 编译器和您对“足够快”的定义。标准 C 编译器通常难以有效利用特殊的 DSP 硬件,例如:
- 可以并行访问的多个存储库
- 定点数据类型
- 圆形缓冲器
在我知道有一个可以从汇编编码中受益的热点之前,我会坚持使用 C。这是我使用的“分析”方法。您可能会感到惊讶的是,有一些方法可以加速不是热点的代码,而是可以删除的中间函数调用。
使用 -O3 优化进行编译。它非常强大。
如果它不够好,您可以根据自己的喜好进一步优化生成的汇编代码,而不是自己在 ASM 中从头开始编写所有代码。