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.

[参考译文] 编译器/XTCIEVMK2LX:如何平衡两端的进程(数据路径A和B)?

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/565461/compiler-xtcievmk2lx-how-to-balance-process-in-two-sides-data-paths-a-and-b

部件号:XTCIEVMK2LX

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

我尝试用“无循环”(无软件流水线)编写一个简单的代码,在我们能达到的最短周期内,只做“两个”1x2 x 2x2复数的复数。 显然,我使用的内部函数的运算次数最少。 当我查看生成的.asm文件时,我发现C6000编译器不会自动使用两端,即使它可以并行运行它们(它们是独立的变量/寄存器)。 它主要发生在装载和存储(D装置)中,同时在M1和M2装置中正确并行执行多路复用。 尽管M2需要使用交叉路径(M2X),因为所有负载只在A侧进行,而存储在B侧。

实际上,我一直在努力通过软件流水线将我的代码中的内部循环最小化,我可以使它完全优化。 我进行单次无循环测试的原因是,我注意到我的代码部分在循环中所用的时间比我优化的内部循环长。 我检查了汇编文件,可以看到编译器不够智能,无法在两端并行处理,这可能会显著减少总周期。

所以,我提出了一个问题:“如何强制编译器使用A侧或B侧来执行某个内部指令?” 我知道有一些方法可以通过解开循环来更好地平衡循环中的寄存器与软件管道,但在“无循环”情况的所有TI文档中我找不到任何有关这方面的信息。 我想知道是否有方法手动执行此操作或强制编译器(可能使用pragma)平衡进程而不使用软件流水线?

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

    Ardi Blackhole 说:
    如何强制编译器对特定内在指令使用A侧或B侧?[/QUOT]

    从C或C++源,没有执行此操作的机制。  请考虑将该代码写入线性程序集。  然后,您可以选择要执行哪些侧指令。  请阅读  C6000编译器手册中标题为“使用汇编优化器”的章节,了解有关线性汇编的更多信息。

     谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢George的迅速回答。 我是否可以通过内联汇编语言命令__ASM("")在代码开头执行黑客攻击,以强制使用A侧的局部变量进行编译? 我发现在开始时定义.Rega/.regb对于我的特定问题已经足够了,但是我在优化编译器手册中看到了一个注释,即我们不能在内联汇编代码和C变量之间使用通用局部变量。

    如果是这样,我必须在程序集中完全编写我的代码,这将更加困难。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ardi Blackhole 说:
    我可以通过内联汇编语言命令__ASM("]

    在代码开始时进行黑客攻击了。

    不会。 这会产生更多问题,而不是解决问题。  以这种方式使用ASM功能肯定会使编译器生成的汇编代码混乱。

    Ardi Blackhole 说:
    如果是这样,我必须将我的代码完全写入程序集,这会更加困难。[/QUOT]

    我同意编写C6000汇编代码很困难。  但您还有另一个选择。  改为在线性装配体中写入。  请尝试。  它比编写C代码要困难一点,但不是很多。  我在上一篇文章中对其进行了一些描述。  您可以在这 本过期的C6000编程器指南中看到一些示例

    谢谢,此致,

    -George

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

    Ardi Blackhole 说:
    如果是这样,我必须将我的代码完全写入程序集,这会更加困难。[/QUOT]

    还有一件事... 您不必重写装配体中的所有内容。  在线性装配体中编写关键函数并从C代码调用它们很容易。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我现在要做的是首先将我的简单函数“转换”为线性汇编代码并正确编译。 因此,我已将.asm生成的文件复制到项目中新添加的.sa文件中,并删除了编译器最后给我语法错误的不必要部分,如“build attributes”

    它仍然无法正确编译,并给出了“错误#1.0234万-D:未解析的符号仍然存在”。 这是否是一种快速转换C到汇编而无需从头开始编写整个代码的正确方法?

    此外,在实际实施中,我可能在装配体内有软件流水线循环,几乎不可能为所有功能编写线性装配体。 正如您所说,我可能会将汇编用于无法进一步优化的代码的关键部分,例如内部循环之外的部分,这不是增加函数调用开销吗? 在这种情况下,内嵌功能是否足以移除所有开销?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ardi Blackhole 说:
    我已将.asm生成的文件复制到新添加的.sa文件中

    这不是通常的做法。  请搜索 在上一篇文章中提到 的程序员指南,以了解标题为"将C代码转换为线性装配体"的章节。  首先将计算隔离到定义明确的C函数。  然后线性装配体中的展示是直接的。

    通过检查编译器生成的程序集,您可以获得一些有关使用哪些指令的提示。  但需要牢记的是一个关键差异。  线性装配体未计划,但编译器生成的装配体为。  按其"自然"顺序书写线性装配体指令。  工具为您排定这些线性装配体说明。  这意味着您可以忽略管道和所有这些延迟插槽。

    另一个建议是考虑... 您可能尝试一次进行太多更改。  为了确保您了解基础知识,请尝试编写一个非常简单的C程序,该程序使用一个线性装配例程。  它将有两个源文件。  一个在C中,一个在线性装配体中。  C代码初始化数组,调用线性汇编函数并打印结果。  线性装配体函数的作用非常简单,如将数组的所有元素相加,并返回总和。

    Ardi Blackhole 说:
    我可能在程序集内有通过管道传递的软件循环[/QUOT]

    这是典型的。  您可以在线性装配体中写入这些内容,工具将为您安排软件管道。  大多数(或全部?) 编程器指南中的线性装配体示例就是这样工作的。

    Ardi Blackhole 说:
    在这种情况下,内嵌该功能是否足以消除所有开销?[/QUOT]

    C代码不能内联在线性装配体中写入的函数。  唯一的接口是C代码调用线性程序集例程。  我理解您对调用函数的开销的担心。  这就是典型的线性装配体函数在大量数据上运行的原因。  然后,进行呼叫和返回所花费的周期更容易证明其合理性。

    谢谢,此致,

    -George