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.

[参考译文] TMS320C6416T:TMS320C6416T

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/992828/tms320c6416t-tms320c6416t

器件型号:TMS320C6416T

您好!

我对优化问题有疑问。  

 以下是我的代码:

/*Loop 进行相关计算。*/


对于(n1=0;n1<1400;n1++)
 {
    FIND_SYNC = 0.0+0.0*I;
 对于(M1=0;M1<200;M1++)
  {
     精细同步+= mpysp (input[n1+m1]、conjf (cmp_MOD_knownsym[M1]));
  }

 f精细_sync1_vector_abs[n1]=cabsf (fut_sync);

我的这部分代码大约需要54、000、000个周期(54 ms),通过 CCS 分析工具进行测量。 任何实时应用都无法提供的功能。 我在时钟频率为1GHz 的 C6416芯片中运行此代码。  

我需要有关优化该环路的帮助。 外部循环运行1400次、而内部循环运行200次。  

我知道循环展开、但这不是很有效。 我想知道可以通过其他方法来减少此循环的执行周期。   

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

    您好!

    我们当然需要更多有关您情况的信息来判断、尽管现在几乎看不到任何考虑因素。

    首先、您似乎在定点处理器上使用单精度进行复杂的数学运算。 据我所知、单精度数学是在 C64x 的软件中实现的。 这意味着每个简单的加法、每个乘法都作为函数调用实现。 这不仅会增加开销、还会阻止循环流水线。 我从未在 C64x 上使用过 complex.h、但我怀疑 mpysp、conj、cabsf -所有这些都是作为函数调用实现的。 这再次阻止循环优化。

    当循环可以流水线化时、C6x DSP 可实现其顶级性能。 我们在 C64x 上进行射频信号处理。 但是、我们始终对数据使用整数表示法。 它应该是 Q 格式数据、但我们即使没有在那里潜水、也能存活下来、只是提前进行适当的扩展。 主要区别在于 C64x 内核具有用于进行整数加法和乘法的硬件、因此无需在软件中仿真。 这样、编译器就可以高效地执行循环移液。 您可能希望看到 spra666.pdf "TMS320C6000上的手动调优循环和控制代码"、只需通过 google 搜索即可。 本指南介绍了如何为 C6x 编写高效代码的有用信息。 也是一个更现代的教程 SPRABG7 "优化 C66x DSP 上的循环"、但它面向 C66x 内核、可以在硬件中执行浮点运算、但这不适用于您的情况。

    如果使用-o3编译器选项、则会发生所有神奇。 一定要这么做。 此外、上述教程介绍了如何读取编译器反馈。 这是需要了解的重要信息、瓶颈在哪里以及可以采取哪些措施来改进。  

    在您的情况下、我们对从射频采样的复杂数据使用整数。 具体而言、它们是16位数据、因为它与 AD/DA 分辨率匹配、而带短接的运算可以打包到 SIMD 指令中。

    希望这对您有所帮助。

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

    同意您的观点、您的帖子缺少重要信息来帮助提供有关此问题的指导。 您的编译器设置是什么? 哪个内存是运行的代码? 您是否启用了 DSP 高速缓存? 您能否使用 DSP TSCL 和 TSCH 寄存器代替 CCS 配置文件时钟来提高精度。  

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

    我的编译器设置为:

    我正在从 IRAM 运行我的代码。  

    我尚未启用 DSP 缓存。 我应该启用 DSP 缓存吗?  

    是的、我已经尝试使用 TSCL 和 TSCH 寄存器。  

    我写道:

    无符号超长整型启动;
    无符号超长整型结束;

    START =_itoll (TSCH、TSCL);

    my_function();

    end=_itoll (TSCH、TSCL);

    但我得到了该误差:

    #20标识符"TSCH"未定义  
    #20标识符"TSCL"未定义  

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

    是的、我使用的是复杂数学。 我添加了以下头文件:

    #include
    #include
    #include
    #include
    #include
    #include
    #include "stdbool.h"
    #include

    #include "fastrts62x64x.h"

    如果在 C64x DSP 中执行复数数学运算不合适、那么如何操作复数(实数和虚数)器件?

    第二、有任何方法可以使用定点数学计算角度。 例如、如果我使用 cos、sin、tan 函数、结果始终为浮点。

    要转换为定点、我们需要乘以32767。 但 cos 和 sin 的答案始终是浮点数。 在 math.h 函数中、这些函数为双精度型或浮点型数据。

    根据您推荐的手册、我正在尝试减少上述代码部分的周期。 感谢您的建议。 如果您在整数格式复杂数字的处理方面有进一步的帮助、请参阅 guide.me。  

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

     DSP 设置和编译器设置存在几个问题、因此代码无法以最佳方式执行。

    https://www.ti.com/lit/ug/spru187u/spru187u.pdf?ts=1618342922401&ref_url=https%253A%252F%252Fwww.ti.com%252Ftool%252Fdownload%252FC6000-CGT-7-4

    请使用优化设置-o3、请启用 DSP L1D/L1P 缓存。 强烈建议您参考 C6000优化应用手册并应用这些优化技术。

    https://www.ti.com/lit/an/sprabf2/sprabf2.pdf?ts=1618343077564

    为了处理定点处理器上的浮点数学运算、我们为 C64x+架构提供了 IQMath 库。 请使用此函数计算角度、cos、正弦值。

    如果您仍遇到问题、我们可以提供进一步的指导。

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

    您好!

    您提出的问题是正确的、处理这些问题有一定的传统。 我们在此简要介绍了主要的途径、您必须学习如何驾驶。

    我认为在定点 DSP 上进行任何重要的浮点工作是毫无意义的、例如 C64x。 另一方面、这些 DSP 是整数中的单个数字运算器。 然后、可以采用所谓的 Q-format、它以一种方式表示为整数的定点数。 我认为 TI 提供了一个库来处理 Q 格式的定点数、尽管有一条学习曲线。

    使用复数在信号处理中很常见。 唯一的区别是实部和虚部都存储并处理为整数。 现在考虑一下您的 AD/DA、它们确实在缩放整数中工作、并提供14-16位的最佳值。 因此、C 的缩写足以存储有价值的信息、而更宽的或浮点的数据类型不会保存任何其他信息。 数学运算期间会产生费用、这是需要仔细规划的事情。

    接下来、将复数的 RE/Im 部分打包为32位字的下半字/上半字是很常见的。 然后、C64x 内核可以使用硬件执行大量复杂操作。 例如、C64x 内核可以在一个周期内添加两个打包的32位复杂容器的上半部分和下半部分、这是复杂的加法。 它还可以通过否定来制作点积和点积-这些运算通常发生在复杂的数学中。 编译器可识别其中的一些操作、有些操作需要显式调用内在函数指令。

    至于角度和谐波函数、有时可以使用共轭乘法来避免、因此内核具有硬件和各自的内在函数。 函数有快速近似值。 最后、用户可以选择定制开发的查找表来加快数学运算。

    别忘了说分裂的罪恶行径。 通常在循环中使用、尤其是在循环中使用、它可能会使性能降低很多、因此有时我们使用牛顿迭代来估算近似的除法运算。

    您需要自行决定、在这些技术中将达到多远、但我建议首先使用打包整数。

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

    感谢您的建议。

    我首先使用 IQMath 库开始优化、以定点执行角度计算。

    我已下载并安装 C64x+的 IQMath 库。 我正在研究  IQMath 库 文档"sprugg9"。 并排运行文档中的示例代码。  

    但我面临一些问题。  

    我首先感到困惑的是   、用于 C64x+架构的 IQMath 库是否与 C6416 DSP 兼容?

    其次、在.lib 文件中、哪一个文件 与 要在 CCS 中项目属性的文件搜索路径中添加的文件兼容?

    但是、为了尝试、我在文件搜索路径中添加了 IQmath_C64x+.lib、并在 include 选项中包含了"include folder"。

    我在 CCS 中编写的代码行:

    #include      /* IQmath 例程的头文件*/

    #define PI 3.14159F

    _iq 输入、SIN_OUT;       /*使用 IQmath 数据类型定义变量*/

    void main (void)

    Input =_IQ29 (0.25*PI);/*以 Q29格式表示的弧度*/

    SIN_OUT =_IQ29sin (输入);

    但是、当我运行此示例代码时、它会显示错误:

    未解析符号 IQNsin,首先在 C:/ti/IQMATH 库中引用.........

    我还尝试添加.cmd 文件:

    .data:IQmathTables > L2RAM

    .text:IQmath > L2RAM

    但是、我仍然得到了该误差。

    请帮助我解决此问题。

     

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

    您好!

    据我所知、C64+架构优于 C64x、因此 C64+ IQMath 库与 C64x 器件不向后兼容。

    您可能需要查看该主题 e2e.ti.com/.../44931

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

    好的、我已经阅读了此链接。  

    我已下载"IQmath_C64x_v212.zip"。  

    但是、我仍然面临一个错误:

    _mpy32su             C:\ti\lib\IQmath_C64x_v212-lib
    _mpy32us             C:\ti\lib\IQmath_C64x_v212-lib
    _mpy32u              C:\ti\lib\IQmath_C64x_v212-lib

    在上面的链接中、还有另一个下载 instrininsic 的链接、"http://tiexpressdsp.com/index.php/Run_Intrinsics_Code_Anywhere"

    但这不会打开。

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

    您好!

    我的观点是、虽然 TI 人员向客户提供了 IQmath_C64x、但该版本似乎从未完整或公开发布。 事实上,利用这种贡献,人们面临着与你相同的问题,而作出的反应是没有办法解决这一问题。 我可能是错的、但在我看来、C64x 的 IQMath 的完整和功能版本似乎不存在。 相反、当时人们是在自行编码这些算法。 就谐波函数而言、有许多所谓的"快速实现"。 它们围绕周期概念和一些近似方法进行了总结、从 Direct Taylor 级到 CORDIC 算法和查找表、无所不包。 我们之所以使用查找表、是因为它们的实现简单、但我无法声称它既不准确也不高效。

    此时、您可能需要后退一步、思考正弦计算是否是实现目标的唯一方法。 也许您的问题也有其他解决方案。

x 出现错误。请重试或与管理员联系。