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.

[参考译文] 编译器/TMS320F2.8075万:使用不同编译器时F2.8075万上的执行时间差

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/580927/compiler-tms320f28075-execution-time-difference-on-f28075-with-different-compilers

部件号:TMS320F2.8075万

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

您好,Champs:

我的客户在使用不同编译器的特定代码时遇到F2.8075万执行时间问题。

他们使用了较早的Cv.GT 6.1 .0的F2.8234万,并使用最新的CGT 16.9 .1.LTS迁移到F2.8075万,而在相同速度为120MHz的SARAM上运行相同的代码时,他们发现存在较大的执行时间差异,因此他们也尝试了F2.8075万上的6.1 v.0,并发现存在问题:

v 6.1 03.49us   
1.0869万h - 1.0719万h = 150H = 336

v 16.9 1.LTS 4.83us
10d20h - 10b8ch = 194h = 404

我在这里附上了源代码快照,链接程序命令文件,C++类中定义的数组,内存中分配的数组地址(两种情况下相同), 编译器控制台,从视图复制的反汇编,两种情况下的映射文件,请您查看一下并告知发生这种情况的原因(我们在这里看到了不同的反汇编代码)?

e2e.ti.com/.../F2.8075万-Compiler.7z

此致,

张卫健

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

    所有代码都是使用--opt_level=off创建的。  (您的版本使用等效的-Ooff)。  编译器开发小组不关心使用--opt_level=off构建的代码的性能。  此外,在--opt_level=off下,没有对版本之间的性能差异进行跟踪。  我并不感到惊讶,这种差别会有,甚至会有更严重的差别。  

    如果性能很重要,则至少使用--opt_level=2进行构建。  如果您有理由不进行优化,这是什么?

    谢谢,此致,

    -George

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

    哦......那么,很遗憾客户系统中的原始设置是-O4,结果相同。

    使用--opt_level=off这里只是为了表明您将 获得相同的"不良"性能,它与优化无关,我们不需要对 "无优化"进行额外的尝试。

    顺便说一下,优化级别关闭后,无论使用哪个版本的编译器,您都应该得到相同的反汇编代码,不是吗?

     您是否可以 通过简化的项目在您的一侧测试代码,或者仅分析反汇编代码,或者您必须从客户那里获得测试案例?

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

    Ricky Zhang 说:
    哦...那么,很遗憾客户系统中的原始设置是-O4,结果相同。

    我们很想弄清楚这一点。  更多信息。

    Ricky Zhang 说:
    使用--opt_level=off这里只是为了显示您将 获得相同的"不良"性能,它与优化无关,我们不需要对 "无优化"进行额外的尝试。

    我理解。  只是我们不会以这种方式分析性能问题。

    Ricky Zhang 说:
    顺便说一下,优化级别关闭后,无论您使用哪个版本的编译器,您都应该获得相同的反汇编代码,是不是吗?[/QUOT]

    它们通常是相似的。  但不完全相同。  这里所经历的差异并不常见,但也不奇怪。

    Ricky Zhang 说:
     您是否可以 通过简化的项目在您的一方测试代码,或者只是分析反汇编代码,或者您必须从客户那里获得测试案例?[/QUOT]

    我们需要一个测试案例。  我认为绩效差异体现在一个职能中。  请 预处理 包含函数的源文件,并将其附加到下一篇文章中。  指示该函数的名称。  按照编译器看到的内容准确显示所有生成选项 ,并指明编译器的版本。

    谢谢,此致,

    -George

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

    函数名称为DAT_Int_InvCurrPQCalc();

    在文件夹2.8075万_TestTime\Source\App下的Inverter.cpp源文件中定义

    由文件夹2.8075万_TestTime\Source\Scheduler下的CtrlISR.cppsource文件中的ePWM_INT_ISR()函数调用,该文件夹包含在文件夹2.8075万_TestTime\Source下的MainProcedure.cpp源文件中,其路径为“#include "Scheduler\ctrlISR.pcp""

    与v.6.1 0和16.9 v.0.LTS编译器一起构建,并附加了这两种情况的控制台

    GPIO43用于测试硬件中的代码执行持续时间

    e2e.ti.com/.../Preprocess.7z

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

    如果在重新生成此问题时遇到困难,或者您需要整个项目进行进一步调查,请附上项目和.map文件以供参考。

    所有编译都使用-Ooff完成,您也可以将其更改为-O4进行测试。

    e2e.ti.com/.../Project-Build.7z

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

    我对该问题的调查仅限于检查编译器生成的汇编代码。  我查看生成了多少个指令,以及这些指令执行的操作类型。  这些因素会影响执行该函数所需的CPU周期数。  基于此,我认为没有理由期望此函数所需的CPU周期数会有很大差异,这是由6.1 0和16.9 .0.LTS编译器生成的。  

    特意使用术语“CPU周期”。  编译器可以影响的就是这些。  编译器无法对因系统效应(如内存等待状态或某种停顿)而丢失的周期执行任何操作。  但也许这种情况是造成这种差异的原因。  不幸的是,我不是系统影响问题专家。

    谢谢,此致,

    -George

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

    [引述用户="George mock"]

    我对该问题的调查仅限于检查编译器生成的汇编代码。  我查看生成了多少个指令,以及这些指令执行的操作类型。  这些因素会影响执行该函数所需的CPU周期数。  基于此,我认为没有理由期望此函数所需的CPU周期数会有很大差异,这是由6.1 0和16.9 .0.LTS编译器生成的。  

    [/引述]

    我想我已经在我的原始帖子中提供了这些信息,其中包括汇编代码以及F2.8075万以120MHz运行时的差异:

    v 6.1 03.49us   
    1.0869万h - 1.0719万h = 150H = 336

    v 16.9 1.LTS 4.83us
    10d20h - 10b8ch = 194h = 404

    那么,您能告诉我,您在两种情况下分别看到多少CPU周期吗?

    为什么   这两个编译器生成的汇编代码会有所不同?

    正如您所看到的,没有其他的构建选项不同,但客户只会更改编译器。

    [引述用户="George mock"]

    特意使用术语“CPU周期”。  编译器可以影响的就是这些。  编译器无法对因系统效应(如内存等待状态或某种停顿)而丢失的周期执行任何操作。  但也许这种情况是造成这种差异的原因。  不幸的是,我不是系统影响问题专家。

    [/引述]

    您认为谁是系统效应专家? 编译器工具团队或C2000团队中的任何人?

    请提供建议。 谢谢。

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

    Ricky,

    [报价]他们以前使用过F2.8234万与Cv GT 6.1 0,现在使用最新的Cv GT 16.9 .1.LTS迁移到F2.8075万,而相同的代码以同样的120MHz速度在SARAM上运行,他们发现执行时间差异很大,因此他们在F2.8075万上也尝试了v 6.1 0,发现存在问题:[/QUOT]

    你在这里所说的SARAM是什么意思。 它是外部RAM设备的内部RAM (通过XINTF/EMIF)。 如果使用内部RAM,则使用哪种RAM (LSX,GSX?)

    此致,

    Vivek Singh

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

    Vivek,

    很抱歉,我制造了困惑。 我指的是内部RAM,如D0/1和GSX RAM。

    您可以在我3月16日的帖子中找到整个项目,以获取所有详细信息。

    顺便说一句,客户此时未启用DCSM或CSM。

    函数名称为DAT_Int_InvCurrPQCalc();

    在文件夹2.8075万_TestTime\Source\App下的Inverter.cpp源文件中定义,该文件夹将复制到GS RAM RAMGS4567 (原点= 0x00F000,长度= 0x0.4万 )以供运行。

    由ePWM_INT_ISR()函数调用(该函数将复制到D0 RAM RAMD01 (origin = 0x00B000,length = 0x0.005万) 以运行。) 在文件夹2.8075万_TestTime\Source\Scheduler下的CtrlCPP源文件中,该文件夹包含在文件夹2.8075万_TestTime\Source下的MainProcedure.cpp源文件中,路径为“#include”CtrlISR\CtrlISR\cpsp。

    联合运行= RAMD01

    .CriticalIntFuncsSecured:load = FLASHCTON,

    load_start(_CriticalIntFuncsSecureLoadStart)

    load_end (_CriticalIntFuncsSecureLoadEnd),

    run_start(_CriticalIntFuncsSecureRunStart)

    页面= 0

    Flash28_API:

    负载= FLASHAB,

    Load_start(_Flash28_API_LoadStart)

    Load_End (_Flash28_API_LoadEnd),

    Run_start(_Flash28_API_RunStart)

    页面= 0

    }

    .CriticalIntFuncsNOTSecured:load = FLASHCTON,

    RUN = RAMGS4567,

    load_start(_CriticalIntFuncsNOTSecureLoadStart)

    load_end (_CriticalIntFuncsNOTSecureLoadEnd),

    run_start(_CriticalIntFuncsNOTSecureRunStart)

    页面= 0

     

    此致,

    张卫健

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

    Vivek,

    我们能否得到您方面的任何回应? 客户推了一下,因为这个问题已经待了很长时间了。

    很抱歉,感谢您的关注。

    此致,

    张卫健

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

    我还没有详细介绍这方面的情况,但我想做一个快速检查-如果你在这里使用ETPWM,那么时间会有所不同,因为ETPWM不是以速度运行(60MHz与120MHz)。 尽管代码大小相同(和相同的指令),但访问时间将不同。 或者您看到CPU算法执行本身的差异(不依赖于外围设备访问)。

    此致,

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

    Vivek,

    否,我们提供的测试案例未使用ETPWM,您只需比较使用不同编译器工具生成的反汇编代码即可。 相同的C代码有很大差异,这确实会导致执行不同的CPU周期。

    此致,

    张卫健

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

    问题是两个不同器件(F2.8234万与F2.8075万)之间的执行周期不同还是同一器件的两个不同编译器版本(F2.8075万)生成的代码不同?

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

    Vivek,

    后者。 将代码从F2.8234万迁移到F2.8075万时发生了问题,但现在我们将范围缩小到同一F2.8075万器件上的不同编译器。

    此致,

    张卫健

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

    在这种情况下,我们必须要求编译小组再次调查此问题。

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

    比较使用不同编译器工具生成的反汇编代码。 相同的C代码

    有很大差异

    我需要重现此结果以了解它是如何发生的。  请按照以下步骤提交测试案例。

    1. 预处理 与所比较的反汇编相关的源文件
    2. 将其附加到您的下一篇文章中
    3. 指示所用编译器的版本
    4. 指示所比较函数的名称
    5. 准确显示编译器看到的生成选项

    谢谢,此致,

    -George

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

    [引述用户="George mock"]

    张卫健
    比较使用不同编译器工具生成的反汇编代码。 相同C代码的差异很大

    我需要重现此结果以了解它是如何发生的。  请按照以下步骤提交测试案例。

    1. 预处理 与所比较的反汇编相关的源文件
    2. 将其附加到您的下一篇文章中
    3. 指示所用编译器的版本
    4. 指示所比较函数的名称
    5. 准确显示编译器看到的生成选项

    谢谢,此致,

    -George

    [/引述]

    我想我已经在3月16日的职位上继续这样做了,你真的需要我重复吗?

    此致,

    张卫健

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

    我们能否期待本周的更新?

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