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.8379万D:使用非零的优化级别进行编译时出现TMU流水线问题

Guru**** 2562120 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/632033/compiler-tms320f28379d-tmu-pipeline-issue-when-compiling-with-optimization-level-different-than-zero

部件号:TMS320F2.8379万D
主题中讨论的其他部件:controlSUITEC2000WARE

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

我想确认我们是否有编译器问题。  

在优化关闭时,我们的示例中的以下功能可以正常工作:

#pragma code_section (RFFT_F32_sincostate_TMU0,".TI.ramfunc")
void RFFT_F32_sincostated_TMU0 (RFFT_F32_struct_handle FFT)
{
浮点delta_phi = 0.125 ;
uINT16_t k = 1;
uINT16_t i,j;
float *dst = FFT->CosSinBuf;

对于(i = 3;i <= FFT->FFTStages;I++){
浮动phi = delta_phi;

用于(j=1;j <= k;j ++)
{
*DST++=__cospuf32 (phi);
*DST++=__sipuf32 (phi);

PHI += delta_phi;
}

*DST++= 0.0 ;
*DST++= 1.0 ;

K =(k * 2)+ 1;

Delta_phi = delta_phi * 0.5 ;
}
}

但是,当将优化级别设置为5时,数据似乎已损坏。 这些是设置:

-v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -O3 --opt_for speed=5 --fp_mode=strict

编译器版本为TI v.16.9 .5.LTS。  

从分解的代码来看,操作的数量似乎少于不违反管道的数量。 对于正弦和余弦运算符,在检索结果(4p指令)之前,我们应该需要4个指令,但我们是简短的:

$C$L12:
空间研委会32 R1H,R3H ;[CPU_]|286|
SINPUF32 R0H,R3H ;[CPU_]|287|
无操作 ;[CPU_]
无操作 ;[CPU_]

MOV32. *XAR5++,R1H ;[CPU_]|286|||
ADDF32 R3H,R3H,R2H ;[CPU_]|289|

MOV32. *XAR5++,R0H ;[CPU_]|287| 

以上是优化后的结果。 如果没有优化,编译器将添加所需数量的NOP,并且代码将正常运行。

请您评论一下吗?

谢谢!

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

    SINPUF32和COSPUF32都需要4个管道周期,这是通过在指令和首次使用其目的寄存器之间的三个单周期指令实现的。 以下是TMU用户指南中的后一个示例:

    COSPUF32 R2H,R1H;R2H = COSPDU (Fraction (R1H))
    NOP;管道延迟
    NOP;管道延迟
    NOP;管道延迟
    MOV32 @CosValue, R2H ; cos value=cos (基数值)

    空间研委会32和R2H之间的三个中间NOP用于MOV32,保证有4个管道插槽。 在您的帖子的反汇编代码中
    空间研委会32与接下来使用其目标寄存器的指令之间有三个指令(即四个管道周期):

    空间研委会32 R1H,R3H
    SINPUF32 R0H,R3H ;<-- Cycle1.
    NOP ;<--循环2
    NOP ;<-- cycle 3.(注塑周期3。

    MOV32. *XAR5++,R1H ;<--循环4
    || ADDF32 R3H,R3H,R2H

    MOV32. *XAR5++,R0H

    SINPUF32 (目标寄存器R0H)也是如此。 对我来说,它看起来不错。 我认为问题在其他地方。

    此致,

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

    Richard

    所附代码说明了该问题。 cos和sin函数之间的周期数并不能解释管道问题,但是修改代码的优化会影响结果,从而产生意外错误。 代码中的任何轻微修改都会更改汇编文件的结构,因此问题很容易解决。 但是,使用此附加代码时,结果是一致的。 可以根据优化级别打开和关闭错误。 我不知道如何解释这种现象。 我的测试没有优化,而是:

    -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -O3 --opt_for speed=5

    e2e.ti.com/.../TMU_5F00_Test.zip

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

    感谢您提交紧凑型测试用例。 我已能够重现该问题,最新的CGT版本中也存在该问题。 这似乎是一个与指针索引和计时有关的问题,但我需要将其交给编译器团队。 我将把这篇文章移到C编译器论坛。

    我相信,如果您延长重复循环,则在末尾添加NOP,这将解决问题。 您的内部环将如下所示:

    对于(uint16_t j=1;j <= k;j++)

    *DST++=__cospuf32 (phi);
    *DST++=__sipuf32 (phi);

    PHI += delta_phi;
    ASM (" NOP");
    }

    您能尝试一下并告诉我它是否有效吗? 它通过一个额外的循环推出循环,但在我的机器上解决了问题。 谢谢。

    此致,

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

    感谢您对此进行调查。 我已经尝试了您的建议,它确实解决了问题。 实际上,使问题表现出来比解决问题更困难。 插入到sin和cos命令之间的任何汇编指令都会使问题消失。 我期待着从编译器团队那里得到消息,因为我们很好奇地了解问题到底是什么。

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

    我来看看。  听起来,后分支或直通可能会违反延迟。

    Anna

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我无法编译附加的测试用例,因为缺少包含文件。 请提交预处理的源文件。 使用-PPO编译并发送*。pp文件。

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

    实际上,编译取决于正在安装的controlSUITE。 我为编译器添加了-PPO选项,但现在出现了错误。 控制台输出随附,供您查看。 我缺少什么?

    感谢您的帮助!e2e.ti.com/.../TMU_5F00_test-console-dump.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不,我认为这是当你进行预处理时常见的错误消息,因为它实际上并不编译。 查看目录(可能是Debug),您应该会看到源名称相同但扩展名为.pp的文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的,请告诉我附件是否起作用!

    e2e.ti.com/.../TMU_5F00_test_2D00_pp.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢,效果很好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在--opt_for speed=2而不是5但保持优化级别相同时,您能告诉我行为是否正确(3)吗?
    这些标志是:
    -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -O3 --opt_for speed=2

    我知道你说当优化被禁用时它就能工作--我想这意味着-Ooff?
    谢谢!
    Anna
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有点困惑。 当我使用上面16.9 列出的选项使用v.LTS.5.LTS进行编译时:
    -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -O3 --opt_for speed=5 --fp_mode=strict

    我看不到与您在上面发布的拆卸匹配的装配体。 根本没有任何NOP。 在--opt_for speed=5处,我们展开循环,并在单个重复块中有多个迭代。 我已使用-O3 --opt_for speed=5和-O3 --opt_for speed=2 (默认的opt_for speed设置)分析了此函数的程序集,我没有看到任何延迟违规,包括在重复块的后分支上。

    我想确保我有您正在使用的相同选项,请验证您的测试用例是否为所提供的选项生成此组件。 您可以添加-s以保留源代码互连的程序集文件。


    以下是-O3 --opt_for speed=2重复块的程序集:

    ;重复块开始;[]
    $C$L1:
    .dwpsn 文件"main.c",行1.8242万,列13,is_stmt,ISA 0
    MOVIZ R2H,#1.536万 ;[CPU_]|1.8242万|
    .dwpsn 文件"main.c",行1.8239万,列13,is_stmt,ISA 0
    空间研委会32 R1H,R3H ;[CPU_]|1.8239万|
    .dwpsn 文件"main.c",行1.824万,列13,is_stmt,ISA 0
    SINPUF32 R0H,R3H ;[CPU_]|1.824万|
    .dwpsn 文件"main.c",行1.8238万,列13,is_stmt,ISA 0
    MOV32. *XAR5++,R3H ;[CPU_]|1.8238万|
    .dwpsn 文件"main.c",行1.8242万,列13,is_stmt,ISA 0
    MOVXI R2H,#537 ;[CPU_]|1.8242万|
    .dwpsn 文件"main.c",行1.8239万,列13,is_stmt,ISA 0

    MOV32. *XAR5++,R1H ;[CPU_]|1.8239万|
    || ADDF32 R3H,R3H,R2H ;[CPU_]|1.8242万|

    .dwpsn 文件"main.c",行1.824万,列13,is_stmt,ISA 0
    MOV32. *XAR5++,R0H ;[CPU_]|1.824万|
    ;重复块结束;[]


    这里是-O3 --opt_for speed=5:

    ;重复块开始;[]
    $C$L1:
    .dwpsn 文件"main.c",行1.8238万,列13,is_stmt,ISA 0
    MOVIZ R0H,#1.536万 ;[CPU_]|1.8238万|
    .dwpsn 文件"main.c",行1.8239万,列13,is_stmt,ISA 0
    空间研委会32 R1H,R3H ;[CPU_]|1.8239万|
    .dwpsn 文件"main.c",行1.824万,列13,is_stmt,ISA 0
    SINPUF32 R4H,R3H ;[CPU_]|1.824万|
    .dwpsn 文件"main.c",行1.8238万,列13,is_stmt,ISA 0
    MOVIZ R2H,#1.536万 ;[CPU_]|1.8238万|
    MOVXI R0H,#537 ;[CPU_]|1.8238万|

    ADDF32 R3H,R3H,L0H ;[CPU_]|1.8238万|
    || MOV32. *XAR5++,R3H ;[CPU_]|1.8238万|

    MOVXI R2H,#537 ;[CPU_]|1.8238万|
    .dwpsn 文件"main.c",行1.8239万,列13,is_stmt,ISA 0
    MOV32. *XAR5++,R1H ;[CPU_]|1.8239万|
    空间研委会32 R1H,R3H ;[CPU_]|1.8239万|
    .dwpsn 文件"main.c",行1.824万,列13,is_stmt,ISA 0
    SINPUF32 R0H,R3H ;[CPU_]|1.824万|
    MOV32. * XAR5++,R4H ;[CPU_]|1.824万|
    .dwpsn 文件"main.c",行1.8238万,列13,is_stmt,ISA 0
    MOV32. *XAR5++,R3H ;[CPU_]|1.8238万|

    MOV32. *XAR5++,R1H ;[CPU_]|1.8239万|
    || ADDF32 R3H,R3H,R2H ;[CPU_]|1.8238万|

    .dwpsn 文件"main.c",行1.8242万,列13,is_stmt,ISA 0
    MOVIZ R2H,#1.536万 ;[CPU_]|1.8242万|
    MOVXI R2H,#537 ;[CPU_]|1.8242万|
    .dwpsn 文件"main.c",行1.8239万,列13,is_stmt,ISA 0
    空间研委会32 R4H,R3H ;[CPU_]|1.8239万|
    .dwpsn 文件"main.c",行1.824万,列13,is_stmt,ISA 0
    SINPUF32 R1H,R3H ;[CPU_]|1.824万|
    MOV32. *XAR5++,R0H ;[CPU_]|1.824万|
    .dwpsn 文件"main.c",行1.8238万,列13,is_stmt,ISA 0
    MOV32. *XAR5++,R3H ;[CPU_]|1.8238万|
    .dwpsn 文件"main.c",行1.8239万,列13,is_stmt,ISA 0

    ADDF32 R3H,R3H,R2H ;[CPU_]|1.8242万|
    || MOV32. * XAR5++,R4H ;[CPU_]|1.8239万|

    .dwpsn 文件"main.c",行1.824万,列13,is_stmt,ISA 0
    MOV32. *XAR5++,R1H ;[CPU_]|1.824万|
    ;重复块结束;[]


    请确认您看到相同的选项或验证正在使用的选项。

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

    您好,Anna:  

    我一开始也很难再提出这个问题。 我们在代码中修改的任何内容似乎都能解决问题。 为了实际确认错误,用户不仅需要维护原始代码结构,而且还需要从控制台收集通过printf提供的信息,并填充Excel电子表格以比较结果。 您显示的汇编代码与我的代码不同,尽管非常相似。 我看到一些正在使用的寄存器不同,例如MOVIZ指令中的寄存器。 这是我最近收集的汇编代码:

    C$L1:
    0.8054万:E801E000 MOVIZ R0,#0x3C00
    29 *DST++=__cospuf32 (phi);
    0.8056万:E279.0019万 COSPUF32 R1H,R3H
    30 *DST++=__sipuf32 (phi);
    0.8058万:E27.8001万C SINPUF32 R4H,R3H
    28. *DST++= PHI;
    0.0805万a:E801E002 MOVIZ R2,#0x3c0000805
    c:E8.081万C8 MOVXI R0H,#0x21900805
    e:E010DB85 ADDF32 R3H,R3H,L0H
    || MOV32 *XAR5++,R3H
    0.806万:E8.081万CA MOVXI R2H,#0x219
    29 *DST++=__cospuf32 (phi);
    0.8062万:E203.0185万 MOV32 *XAR5++,R1H
    0.8064万:E279.0019万空研委会32. R1H,R3H
    30 *DST++=__sipuf32 (phi);
    0.8066万:E278.0018万 SINPUF32 R0H,R3H
    0.8068万:E203.0485万 MOV32 * XAR5++,R4H
    28 *DST++= PHI;
    0.0806万a:E014DB85 ADDF32 R3H,R3H,R2H
    || MOV32 *XAR5++,R3H
    29 *DST++=__cospuf32 (phi);
    0.0806万c:E203.0185万 MOV32 *XAR5++,R1H
    32 PHI += delta_phi;
    0.0806万e:E801E001 MOVIZ R1,#0x3C00
    29 *DST++=__cospuf32 (phi);
    0.807万:E27.9001万D COSPUF32 R5H,R3H
    30 *DST++=__sipuf32 (phi);
    0.8072万:E27.8001万C SINPUF32 R4H,R3H
    0.8074万:E203.0085万 MOV32 *XAR5++,R0H
    32 PHI += delta_phi;
    0.8076万:E8.081万C9 MOVXI R1H,#0x219
    28 *DST++= PHI;
    0.8078万:E203.0385万 MOV32 *XAR5++,R3H
    29 *DST++=__cospuf32 (phi);
    0.0807万a:E012DD85 ADDF32 R3H,R3H,R1H
    || MOV32 *XAR5++,R5H
    30 *DST++=__sipuf32 (phi);
    0.0807万c:E203.0485万 MOV32 *XAR5++,R4H
    C$L2:
    0.0807万e:E2AF05BE MOV32 R5H,*--SP,UNCF 

    这些都是我的编译器选项:

    -v28 -ml -mt --cla_support=cla1 --float_support=fpu32 --tmu_support=tmu0 --vcu_support=vcu2 -o3 --opt_for _speed=5 --include_path="C:/users/a2.7408万U/customers/cot/cot/cot/cips/jim_lect/f28dxdx_cxd/f00/f38/f38/cip/cip/f38/cip/f38/cip/f38/f38/cip/cip/cip/cip/f38/cip/f38/cip/cip/f38_cip/cip/f38/cip/f38/cip/cip/cip/cip/cip/cip/cip/f38/f38/cip/cip/cip/f38/cip/cip/cip/cip/cip/f38_cip/cip/cip/cip/cip/ 16.9

    谢谢!

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

    预处理的文件,选项和编译器版本16.9 .5.LTS的确切集是否会导致错误?

    如果所有这些都相同,您是否仍会收到错误,只能使用--opt_for speed=2而不是--opt_for speed=5?

    您是在Windows还是Linux上进行编译?

    我不会对您提供的预处理文件进行修改。  我只检查程序集是否有编译器错误,并且无法运行程序。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将在其他工作区中尝试预处理的文件。

    我仍然看到错误--opt_of_speed=2。

    我正在使用Windows进行编译。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果唯一的区别是寄存器号码,就不需要重新编译预处理的文件了--我是在Linux上编译的,这可能会造成一些小的差异,例如寄存器名称。 只要指示是一样的,我就不会担心。 但是,您最初发布的代码与NOP看起来完全不同--我想要么是不同的源代码,要么是不同的选项?

    请尝试-O2,-O1和-Ooff (未指定--opt_for speed设置),并告诉我哪些会导致错误,哪些不会导致错误。

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

    以下是您发布的代码。 环路在延迟违规方面没有任何问题。 请参阅,对于每个多周期指令,我已注意到在使用其输出寄存器之前有多少个延迟插槽。 根据我们编码的有关管道的信息,这些信息都是准确的:
    ADDF32在被TMU指令使用之前需要2个延迟周期
    TMU指令在使用其输出之前需要2个延迟周期


    C$L1:                                          在使用输出寄存器之前延迟插槽
    0.8054万:E801E000 MOVIZ R0,#0x3C00
    29 *DST++=__cospuf32 (phi);
    0.8056万:E279.0019万 SPCOUF32 R1H,R3H             5.
    30 * DST++=__sipuf32 (phi);
    0.8058万:E27.8001万C SINPUF32 R4H,R3H              7.
    28 *DST++= PHI;
    0.0805万a:E801E002 MOVIZ R2,#0x3C00
    0.0805万c:E8.081万C8 MOVXI R0H,#0x219
    0.0805万e:E010DB85 ADDF32 R3H,R3H,R0H           二
    || MOV32 * XAR5++,R3H
    0.806万:E8.081万CA MOVXI R2H,#0x219
    29 *DST++=__cospuf32 (phi);
    0.8062万:E203.0185万 MOV32 * XAR5++,R1H
    0.8064万:E279.0019万 SPCOUF32 R1H,R3H             3.
    30 * DST++=__sipuf32 (phi);
    0.8066万:E278.0018万 SINPUF32 R0H,R3H              6.
    0.8068万:E203.0485万 MOV32 * XAR5++,R4H
    28 *DST++= PHI;
    0.0806万a:E014DB85 ADDF32 R3H,R3H,R2H           二
    || MOV32 * XAR5++,R3H
    29 *DST++=__cospuf32 (phi);
    0.0806万c:E203.0185万 MOV32 * XAR5++,R1H
    32 phi += delta_phi;
    0.0806万e:E801E001 MOVIZ R1,#0x3C00
    29 *DST++=__cospuf32 (phi);
    0.807万:E27.9001万D COSPUF32 R5H,R3H            4.
    30 * DST++=__sipuf32 (phi);
    0.8072万:E27.8001万C SINPUF32 R4H,R3H             4.
    0.8074万:E203.0085万 MOV32 * XAR5++,R0H
    32 phi += delta_phi;
    0.8076万:E8.081万C9 MOVXI R1H,#0x219
    28 *DST++= PHI;
    0.8078万:E203.0385万 MOV32 * XAR5++,R3H
    29 *DST++=__cospuf32 (phi);
    0.0807万a:E012DD85 ADDF32 R3H,R3H,R1H         2 (环的后缘)
    || MOV32 * XAR5++,R5H
    30 * DST++=__sipuf32 (phi);
    0.0807万c:E203.0485万 MOV32 * XAR5++,R4H
    C$L2:
    0.0807万e:E2AF05BE MOV32 R5H,*—SP,UNCF



    尝试在程序中单步执行,以查找数据在什么位置被损坏。 如果您可以确定数据损坏的确切指令,我们可以查看程序中的其他点是否存在代码生成错误。 或者某个地方可能存在内存损坏问题。

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

    我可以使用其他预处理文件重现错误。  区别在于PHI未保存回*DST。  生成的装配体看起来像论坛上发布的原始装配体:

    RPTB $C$L3,AR6;[CPU_]|1.9259万|
    ;重复块开始;[]
    $C$L2:
    .dwpsn文件"main.pp",行1.9261万,列13,is_stmt,ISA 0
    COSPUF32 R1H,R3H;[CPU_]|1.9261万|
    .dwpsn文件"main.pp",行1.9262万,列13,is_stmt,ISA 0
    SINPUF32 R0H,R3H;[CPU_]|1.9262万|
    NOP;[CPU_]
    NOP;[CPU_]
    .dwpsn文件"main.pp",行1.9261万,列13,is_stmt,ISA 0

    MOV32 *XAR5++,R1H;[CPU_]|1.9261万|
    || ADDF32 R3H,R3H,R2H;[CPU_]|1.9264万|

    .dwpsn文件"main.pp",行1.9262万,列13,is_stmt,ISA 0
    MOV32 *XAR5++,R0H;[CPU_]|1.9262万|
    ;重复块结束;[]

    在这里,RPTB的后边缘存在延迟冲突:在ADDF32到R3H和SPCOUF32之间,RPTB顶部应该有2个延迟插槽,但只有1个。  我已提交CodeGen-3878以跟踪此问题。

    谢谢!

    Anna