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:由于调用编译器未内联的内联函数、循环未优化

Guru**** 2560640 points
Other Parts Discussed in Thread: MATHLIB

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/693783/compiler-tms320c6678-loop-not-optimized-due-to-call-to-an-inline-function-non-inlined-by-the-compiler

器件型号:TMS320C6678
主题中讨论的其他器件:MATHLIB

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

您好!

我有一个函数、用于计算两个复数矢量的相位(在两个矢量上执行 atan2 ()))并使用 C6678 MATHLIB (atan2sp_I)中的优化 atan2。 我在所有优化均处于活动状态的情况下进行编译:

  • opt_level=3
  • opt_for_speed=5
  • speculate_loads=自动
  • optimize_with _debug=on (也与 sulpress all debug 连接)

当我在一个更大的文件内编译函数时(在输出循环内调用它)(test_atan)、test_atan ()是用 ii = 85进行软件流水线处理的(无论如何它不使用 SPLOOP)、并且函数 atan2sp_i 是内联编译的。

问题是、当我在单独的文件中将 test_atan (在所有声明为内联的被调用函数中组合在一起)放置时、由于以下原因、它未进行优化:

无法有效地调度第141行的循环、因为它包含函数调用("_Z27atan2f_sr1i_atan2spi_inlineffiii")。 尝试使"_Z27atan2f_sr1i_atan2spi_inlineffiii"成为内联函数。

即使 atan2f_sr1i_atan2spi_inline 已声明为内联、并且在我不隔离编译它时正确内联的情况也是如此。

我希望将其保留在单独的编译单元中、这既是因为可重用性、也是因为正确优化编译过程需要大量时间。

e2e.ti.com/.../atan_5F00_no_5F00_optimize.cpp

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

    需要了解这一点的人今天已经离开了。 我会将此标记给他们、让他们在明天回来时查看一下。

    此致、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要使内联正常工作、被调用函数的源代码必须在调用站点可见。 否则、它如何知道用什么替换呼叫? 这通常意味着被调用方在同一源文件或头文件中定义。
    链接时优化将提供一种使用单独编译单元来完成它的方法、但(我想)我们在任何可用的 C6000编译器中都没有这种方法。 (对于 ARM 和其他器件、它是-o4。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在我先前附加的文件中、您可以看到所有函数都在同一编译单元中定义为"静态内联"。 请注意、源不包含任何头文件(除了 C6x.h)、不会声明任何外部引用并进行编译而不会出现错误、因此所有必需的函数都在同一编译单元中声明和定义:

    静态内联 float divspMode_atan2spi_inline (float a、float b){...}
    
    静态内联浮点 atan2f_sr1i_atan2spi_inline (float G1、float pih、int s、int bn、int an){...}
    
    静态内联 float atan2sp_inline (float a、float b)
    {
    (笑声)
    g = divspMod_atan2spi_inline (b、a);
    
    res = atan2f_sr1i_atan2spi_inline (g、pih、s、bn、an); //此处出现问题,即使它是在同一编译单元中内联定义
    
    的}
    
    void test_atan (...)
    {
    for (...)
    atan2sp_inline(...);
    
    } 

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

    很抱歉,我误解了你的问题(我不在办公桌旁,没有先检查你的测试案例)--我认为你想让被叫方分离,而不是整个组合。

    好的、问题是尺寸。  编译器对内联的次数有一些内部限制、部分限制用于-opt_for_speed 控制、部分限制用于避免某些扩展过快和编译器崩溃的不良情况。  这些限制表示为与编译单元的总大小成比例的最大大小增长。  当您一起编译时、比例增加是一个大于 atan 文件被分隔时的绝对数、而较大的数字足够容纳所有调用、但较小的数字则不是。

    这似乎是使用 FUNC_ALWAYS_INLINE pragma 的好地方: 您确实希望所有调用都内联并且文件是自包含的。  "inline"关键字是对编译器的建议、但 FUNC_ALWAYS_INLINE pragma 是一个命令、可覆盖任何增长限制。