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.

[参考译文] RTOS/TMS320C6678:添加两个浮点值的内在函数

Guru**** 2604225 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/651372/rtos-tms320c6678-an-intrinsic-function-to-add-two-floats

器件型号:TMS320C6678

工具/软件:TI-RTOS

您好!

我正在寻找一个获取两个浮点值并返回和(也是浮点值)的内在函数。


我仅找到 "__float2_t _daddsp   (__float2_t,__float2_t);"

但我不希望 包含两个浮点值的类型"__float2_t"-它对于我的用途来说太大了。

在哪里可以找到该函数?

谢谢、
Ronen
 

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

    您不需要为该运算使用内在函数。  (在 C 语言中没有"本机"表示运算的方法时、通常会公开内在函数。 )类似这样的代码应编译以使用浮点加法指令:

     float my_add (float x、float y)

     {

      返回 x + y;

     }

    如果您尝试过该操作、但它执行了意外操作、您会看到什么意外行为?

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

    感谢你们的忏悔!
    我没有遇到意外行为、但我的目的是同时添加8个浮点数、从而获得更好的运行时间。
    我认为一个内在函数将有助于获得此结果-就像使用"_ADD2"添加两个 INT 一样。

    是否有办法更好地添加8个浮点值-如果并行处理是一个选项、我想知道如何启用它。

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

    如果要同时添加许多对浮点数字,则_daddsp()是您要查找的内在函数。  为什么您说_float2_t 太大、不适合您的用途?

    在机器码级别,_daddsp()映射到 DADDSP 指令。  TI 文档 SPRUGH7指出、DADDSP 可以在四个执行单元中的任何一个上运行:.L1、.L2、.S1或.S2。  这个指令将两个寄存器对作为输入、并生成一个寄存器对作为输出。  这意味着、如果寄存器中有八个_float2_t 值、则可以在单个周期中最多发出四条 DADDSP 指令、添加八对浮点值。  如果您看一下 TI 针对 C66x 器件的"最大 GFLOPS"数字、它每周期可处理16个 FLOPS、一种方法是使用四个 DADSP 加两个 QMPYSP。  存储器带宽通常是此类操作的限制因素、部分原因是.L1和.L2单元也负责所有存储器加载和存储。

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

    您好、Michael、
    感谢您的回答!

    您询问"为什么您说_ float2_t 太大、不适合您的用途?"
    我 看到- typedef double  __float2_t; 这意味着它不是浮点型-它是双精度型(64位而不是32位),这就是它对我来说太大的原因。

    其次 ,根据您的回答,可以在一个周期中添加8个浮点值,您能给我一个代码示例吗?


    第三、我 在论坛 https://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/546475#pi316458filter=all&pi316458scroll=false 中找到了另一个主题

    C66x 设计团队的底线是:"我的意思是硬件不能在单个功能单元上启用4个浮点加法运算"

    所以我有点困惑,因为你有冲突的答案 ,你能帮我清除吗?


    谢谢、
    Ronen

     

     

     

     


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

    Ronen、

    "double"类型仅显示、因为需要64位来保持两个单精度浮点值、而"double"类型是64位浮点类型。 用户可能希望编译器将__float2_t 识别为内置矢量类型,但不会识别它。 我认为 CGT 8.x 确实会识别诸如"float2"之类的 OpenCL 激励类型、但它们可能无法与内在函数配合使用。  无论类型名称是什么、它最终都会在 DSP 内核中使用两个连续编号的寄存器:一个偶数寄存器和以下奇数寄存器(例如 A2和 A3)。

    您发现的帖子是正确的:C66x ISA 不提供在单个功能单元上执行四个浮点加法运算的任何方法。 在我之前的答复中、我提到了四个功能单元、每个功能单元都可以通过 DADDSP 指令在一个周期中执行两个浮点加法:.S1、.S2、.L1和.L2单元。 软件必须使用所有这四个值来实现每个周期八个浮点加法。 这与.M1和.M2功能单元形成对比、每个功能单元可在每个周期执行四次浮点乘法(使用 CMPYSP 或 QMPYSP 指令)。 SPRUGH7等 TI 文档详细介绍了不同的功能单元。

    Michael

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