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.

[参考译文] CCS/OMAP-L138:由于std::exp调用而导致环路取消资格

Guru**** 2587365 points
Other Parts Discussed in Thread: MATHLIB

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/605959/ccs-omap-l138-loop-disqualification-due-to-std-exp-call

部件号:OMAP-L138
主题中讨论的其他部件:MATHLIB

工具/软件:Code Composer Studio

据我所知,软件管道内衬对于高性能环路至关重要。  如果我有一个简单的循环来计算浮点数组的std::expf (float),我会得到顾问的建议:

建议#3万:无法有效安排第10行的循环,
因为它包含函数调用("expf")。
尝试内联呼叫或考虑重写循环。

...如何内联标准库调用(如std::exp)?

一些研究表明我可能会使用 Mathlib,但关于如何将其与Code Composer以及使用内联版本进行链接和使用的文档非常缺乏。

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

    从实际角度来看,expf函数太大,无法内联。  遗憾的是,这意味着此循环无法通过软件实现流水线。

    谢谢,此致,

    -George

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

    您好!

    有一个非常简单的规则:函数调用不进行流水线,但内联函数除外。 当您使用标准库时,这意味着没有内联,是的,没有流水线。 因此,优化的库(如mathlib)在这种情况下是一种选择,除非您愿意实施自己的优化解决方案。

    至于集成流程,您必须习惯它,就像其他产品一样,例如DSPLIB,以同样的方式进行互连。 这包括几个基本步骤:

    1. 如果以前没有安装mathlib产品,请安装该产品。
    2. 在项目属性中,常规,产品勾选所需的mathlib版本。
    3. 在项目属性,链接器,文件搜索路径,包括库文件中-添加 其中的mathlib.(正确的扩展名),您可以在TI\mathlib_C67x_version\lib\中的某个位置找到它
    4. 在'Add lib search sir '的正下方添加上述文件夹的位置。 您可能需要使用变量${TI_MATHLIB_C67x_INSTALL_DIR}
    5. 找到TI\mathlib_C67x_vaersion\packages\ti\mathlib\src\expsp\expsp_d.c以演示如何使用expsp()函数。

    请注意,通过TI库,它们提供了带有演示的*_d.c文件。 在这些演示中,您将找到直接的C实现,使用处理器内部函数(*_I)实现和优化版本。 在您的代码中包含后一个,如

    用于( i = 0;.)
    y[i]= expsp( x[i]); 

    就是这样。

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

    当然,您必须添加适当的"包括"和"包括"搜索路径。

    如果您的作业只是获取矢量参数的指数矢量,您可能需要查看expsp_v( float * a, float * output, int size )。 这将节省重复函数调用的开销。 与内联函数相比,这可能非常有效,因为向量函数内部的循环可能会通过管道传递。

    最后,根据您的输入范围和所需的精度,您可以实现自己 的快速近似值,因为DSP上的乘法比较便宜。