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.

[参考译文] 编译器:将代码生成工具链从7.4.x 升级到8.3.x 时性能不佳

Guru**** 2581155 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1111294/compiler-bad-performance-when-upgrade-the-code-generation-toolchain-from-7-4-x-to-8-3-x

大家好

最近、当 为 C66x DSP 进行编译时、我将 C6000代码生成工具链从7.4.x 升级到8.3.x。 如果性能更差、并且我检查了生成的汇编、我发现当内联函数具有作为 restrict 引用传递的输入参数时、新编译器的性能更差、如下所示  

静态空 inline_smpy2_hi_lo (int src1、int src2、int * restrictout_hi、int * restrict out_lo)

long long out =_smpy2ll (src1、src2);
* out_hi =_hill (out);
* out_lo =_loll (out);

对于()

_smpy2_hi_lo (inA1、inB1、&out_HI1、&out_LO1);

我知道我可以使用具有64位返回参数的_smpy2ll 来简化代码。 但我想知道、为什么同一代码可以与编译器 v7.4.x 一起正常运行、但不适用于 v8.3.x 在最新的 v8.3.x 编译器中是否有一个简单的编译器选项来处理带有参考参数的内联函数?

谢谢你。

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

    请查看添加编译器选项--legacy 是否会提高性能。  如果没有、则对于存在此问题的源文件、请调用 _smpy2_hi_lo、 请按照文章 如何提交编译器测试用例中的说明进行操作。

    谢谢、此致、

    乔治

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

    感谢 George 的建议。 我尝试了--legacy 选项,它不起作用,实际上它甚至会使性能变差。 我将尝试按照您的建议提交编译器测试用例。

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

    e2e.ti.com/.../test_5F00_smpy2ll.pp.txt

    你好、George。 附件是从我的 Linux makefile 生成的 pp 文件。

    编译器版本 ti-cgt-C6000_8.3.12

    编译器选项: --abi=eabi --strip_coff _underscore -mv6600 -O3 -pm -mf -mt --debug_software_pipeline --src_interlist --preproc_with_comment --preproc_with_compile

    要尝试的任何提示、请告诉我。 非常感谢。

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

    感谢您的测试案例。  我能够再现同样的行为。  我提交了 EXT_EP-10852条目  以进行调查。  欢迎您访问该链接。

    最好的权变措施是从参数中删除对函数_smpy2_hi_lo 的限制。  这些相同的参数已在调用函数 ym_mult_Q15中进行了限制修改

    谢谢、此致、

    乔治

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

    George、感谢您的反馈。 是的、从内联函数中删除 restrict 关键字确实使优化 ym_mult_Q15有效。 但奇怪的是、并非所有具有 restrict 关键字的内联函数都会使优化变得更加糟糕。 我有几个具有类似声明  的内联函数、只有少数函数会出现优化问题、例如函数_smpy2_hi_lo。 我有一些其他函数、即使使用 restrict 关键字的 removel、这些函数也无法与新编译器良好配合使用。 请帮助您了解可能存在的问题。

    e2e.ti.com/.../test_5F00_accum2Ch.pp.txt

    编译器版本 ti-cgt-C6000_8.3.12

    编译器选项: --abi=eabi --strip_coff _underscore -mv6600 -O3 -pm -mf -mt --debug_software_pipeline --src_interlist --preproc_with_comment --preproc_with_compile

    从优化输出中、如果使用 CGT v7.4.24、则 i=4表示上面的代码行。 但是、如果使用 CGT v8.3.12、则 i=7。 这是相当大的性能损失。 在上述情况下、内联函数参数中使用的 restrict 关键字无关紧要、性能相似。 我已经检查了汇编代码、编译器似乎无法使用自动地址更新生成加载指令、这一点在旧工具链中很重要。

    任何变通方法都可以使编译器更好地工作、我希望新工具链持续得到改进、这就是我计划升级工具链的原因。  

    此致

    胡安

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

    感谢您提供第二个测试案例。  我可以重现相同的行为。  我提交 了 EXT_EP-10854 以对此进行调查。  欢迎您访问该链接。

    同时、内联函数的编码方式有点奇怪。  它返回一个结果 int 结果、然后通过指针分配另一个 int 结果。  然后、在对内联函数的所有调用之后、它会将这两个 int 结果相加。  编译器很难始终如一地看到所有这些生成良好的代码。  

    作为替代方案、请考虑使用 DSPLib 中的一个函数。  即使它没有与您完全一样的功能、它也会有一些接近的东西。  了解它使用的编程技术。  它很少(从不?) 按照代码的方式使用内联函数。

    谢谢、此致、

    乔治

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

    抱歉 George。 我不能抓住你的观点。 我想您可能会误认为两个参数 cvOutCh1和 convOutCh1。  通过指针的返回结果是局部参数  cvOutCh1、并与全局 convOutCh1累加。 此功能类似于同时对通道进行 fir 滤波、与 DSPLIB 中的 fir 滤波非常相似、但具有两个通道输入、可减少存储负载运行。

    当然、我应该对累积的全局变量进行更好的命名、以避免误解。

    再次感谢您将编译器问题归档以便进一步调查。

    此致

    胡安

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

    Huan、

    乔治今天外出、将于周一回到办公室。

    此致、

    John

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="9290" URL"~//support/tools/code-composer-studio 组/CCS/f/code-composer-studio 论坛/1111294/compiler-bad-performance-when upgrade-code-general-toolchain-from-7-4-x-TO-8-3-x/4122330]George 42330"。 我不知道你的观点。

    我认为这不是一个非常重要的问题。  我说...

        *p_conOut1 = convOut1;
        return convOut;

    ...不寻常。  我不希望任何编译器能够很好地处理它。  旧编译器会执行某种操作。  我将 DSPLIB 作为更典型编码技术的示例。

    谢谢、此致、

    乔治

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

    你好、George。 新编译器或旧编译器会根据您从生成的汇编中列出的内容来处理关键部分。 对于示例代码、从汇编代码中、新编译器行为不良的位置有两个:

    1.coef 的复制负载

    2.地址更新的额外增加,而不是使用增量寻址

    这些额外的指令占用了更多的执行单元、从而增加了迭代周期。

    希望能提供帮助。

    此致

    哈恩