This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320C6678:用CCS生成的ASM代码替换c函数时,代码运行速度要慢得多

Guru**** 2595805 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/623761/compiler-tms320c6678-code-run-much-slower-when-replacing-c-function-with-asm-code-generated-by-ccs

部件号:TMS320C6678

工具/软件:TI C/C++编译器

我在使用ASM功能时遇到一个奇怪的问题。 我有一个用c编写的程序,它包含几个功能。 我想重写ASM中的一个函数。 作为第一次尝试,我复制CCS生成的ASM代码,这是通过使用CCS中的Disassembly (分解)窗口实现的。 但这一功能的作用要低得多。 当函数用C写入时,它使用大约2.3万个周期。 当我用ASM代码替换它时,它使用大约15万个周期。 我不明白为什么ASM代码运行速度要慢得多?

下面是有关我的计划的一些信息:

1)整个程序以C语言编写,我在TMX320C6678演示板中运行。 程序在单核模式下运行。

2)我使用_itoll (TSCH,TSCL);来测量此函数消耗的时间。

3)在此函数中,它从输入缓冲区读取数据,执行一些乘法和加法,然后将数据写入输出缓冲区。 因此它不会调用任何其他函数。

4)我对ASM代码所做的唯一更改是更改其中标签的名称。

5)文本部分放置在L2/SRAM中,所有其他部分放置在多核共享内存中。

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    建议:使用编译器选项“保留生成的程序集...” --keep _asm,在Advanced Options -> Assembler options中)以获取生成的ASM代码(可能会抑制不能在手动写入的ASM文件中使用的调试信息)。 您将获得一个更干净的源文件以开始。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当函数以C语言写入时,它使用大约2.3万个周期。 当我用ASM代码替换它时,它大约需要15万个周期。[/QUOT]

    这听起来像是某种缓存问题,或者可能是内存组冲突。  我不是这种记忆效果的专家。  我会让其他人来看看。

    测试这是否是内存影响问题的一种方法... 确保汇编函数的大小与C函数完全相同。  如果需要,添加NOP说明。  链接后,确保所有内容(代码和数据)位于同一地址。  然后测试。  如果执行恢复到2.3万个周期,则肯定存在内存影响问题。  如果不正确,则询问您的测量方法是否正确。

    虽然使用--keep _asm的建议很好,但更好的建议是使用--src_interlist。  这会使汇编文件被保留,并将注释添加到源代码中,使您能够更好地理解汇编代码。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我加入TI时的工作重点是DSP优化等。因此,我在职业生涯早期为C6000写了一些组装。  考虑到VLIW体系结构和未受保护的管道,很难为该设备编写程序集,而且很难比编译器做得更好。

    在走纯汇编语言的道路之前,您是否研究过使用pragma?  必须迭代pragma非常适合通知编译器有关循环的约束(例如最小值,最大值,多个值)。  如果可以保证函数的不同指针输入不指向重叠缓冲区,则“限制”关键字对指针非常有用。  仅使用这两种简单的方法就可以帮助编译器生成更高效的代码。  我假设您已经提高了编译器中的优化级别。

    除了必须迭代和restrict关键字之外,优化的下一步通常是使用内部函数。  我发现内部函数比汇编更好。  它使您可以让编译器使用非常具体的指令,而不必深入研究编写程序集的所有细节。  如果您正在处理打包的数据(例如一组16位字等),则可以使用专用的66x指令同时处理一组项目。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您对关键字"限制"的建议。 对我来说很好。

    事实上,我想将此函数重写为ASM代码,因为我发现此函数的速度不稳定。 当我优化其他功能并保持此功能不变时,此功能的速度不稳定。 有时它仅使用2.3万个周期。 有时它使用15万个周期。 我不知道原因。 我猜可能是因为编译器生成了不同的ASM代码。

    现在我添加关键字"restrict (限制)"。 此功能始终使用2.3万个周期。 一个非常有用的关键字!

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助。 按照Brad Griffis的建议,我在C函数中添加关键字“限制”,这对我有效。 所以,这确实是一个记忆效应问题。