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.
您好!
我对优化问题有疑问。
以下是我的代码:
/*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 设置和编译器设置存在几个问题、因此代码无法以最佳方式执行。
请使用优化设置-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
好的、我已经阅读了此链接。
但是、我仍然面临一个错误:
_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 算法和查找表、无所不包。 我们之所以使用查找表、是因为它们的实现简单、但我无法声称它既不准确也不高效。
此时、您可能需要后退一步、思考正弦计算是否是实现目标的唯一方法。 也许您的问题也有其他解决方案。