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.

[参考译文] LAUNCHXL-F28379D:执行 asinf 函数的 CPU 周期

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/878444/launchxl-f28379d-cpu-cycle-to-execute-asinf-function

器件型号:LAUNCHXL-F28379D

尊敬的 TI 专家:

我正在使用 C2000 F28379D Launchpad。 我测试了 CPU 周期以执行"math.h"中的 asinf (float x)函数。 但结果与我预期的不符。 我认为该 LaunchPad 可能只需20到30个周期即可运行此函数、事实是它需要高达6822个 CPU 周期来处理 asinf 函数。 我已附上以下图片。    

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

    在"优化"下、请确保--fp_mode =宽松(不严格)。 这允许使用 TMU。

    此外、在开始性能评测测量之前、双击时钟将其设为0。 数字太高、因此在我看来、在测量之前它似乎没有被清除。

    谢谢、

    Sira

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

    由于 TMU 不支持 arcsin 或 arcos 指令集、因此您将有更多的工作要做。  您可以使用两个反向 TRIG 函数和 arctan 的 TMU 支持来实现以下函数:

    易失性浮点 x = 0.6513246f;
    volatile float v、a、b;
    void main (void)


    // a = asinf (x)
    v = x /sqrtf (1 -(x*x));
    a = atanf (v);

    // b = acosf (x)
    v = sqrtf (1 -(x*x))/ x;
    b = atanf (v);
    (笑声)

    在-fp_mode =宽松且优化关闭的情况下、这些应该在~60个周期内进行计算。

    此致、

    Richard

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

    Richard、

    很好的收获 感谢您的注意。

    谢谢、

    Sira

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

    您好 Richard、

    感谢您的全力帮助。 我尝试将 asinf 转换为 atanf、现在我的 Launchpad 需要大约63个周期来处理。 大进步。 我还有一件事要澄清、如果您能提供帮助、我将不胜感激。 正如 TI 在一日技术讲座文档中提到的、TMU 只能在1个周期内以 atan 的形式处理数学函数、但在实际的 MCU 上、可能需要30个周期来处理数学函数。 您能给我一个建议来实现这一性能吗? 我附上了一份文件图片  

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

    感谢您为我提供建议。

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

    车间材料是指装配说明 ATANPUF32。 在结果可用之前、这个指令需要三个延迟时隙。 在汇编语言中编码时、通常会将这些时隙用于其他东西、但在 C 语言中它们将显示为 NOP、因此获得结果的流水线周期总数为5。 此外,该指令还返回“标么值”,因此要获得以弧度表示的答案,您需要乘以2*PI,这需要另一个额外的延迟时隙。 从 C 调用时会产生一些开销、因此您会看到更多周期。 有两个 C 内在函数可实现更高效的 atanf()计算,因此我们可以使用这些函数来加快计算速度。 请参阅 C 编译器指南的第171页:
    http://www.ti.com/lit/ug/spru514s/spru514s.pdf

    现在的情况比我之前解释的要复杂一些。 ATANPUF32的输入范围有一定的限制、这是必须遵守的、否则答案是错误的。 我之前使用的反向三角公式可能会合法地返回超出此范围的值、在这种情况下、我们需要执行稍微不同的计算。 此外、我们需要允许对 ASIN 和 acos 进行负面输入、因此整体代码会更复杂一些。

    我将提供一些用于计算这些函数的 C 代码、我认为这是可靠的。 我认为通过汇编代码可以显著加快速度。 下面的所有变量都是浮点值。

    // arcsin
    PHI = fabsf (theta);
    asin_v = phi / sqrtf (1 -(phi*phi));
    如果(ASIN_v > 1.0f)

    ASIN_b = 1.5708f -_atan (1.0f / ASIN_v);

    其他

    asin_b =__atan (asin_v);

    IF (signbit (theta))

    asin_b =-asin_b;

    // arcos
    Acos_v = sqrtf (1 -(phi*phi))/ phi;
    如果(acos_v >1.0f)

    ACS_b = 1.5708f -_atan (1.0f / acos_v);

    其他

    ACS_b =__atan (acos_v);

    IF (signbit (theta))

    ACS_b = 3.142159f - acos_b;

    此致、

    Richard

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

    感谢您的解释。 我真的很喜欢它。