为了分析目的,我可以人为地减慢 C 三角函数的速度吗?

Posted

技术标签:

【中文标题】为了分析目的,我可以人为地减慢 C 三角函数的速度吗?【英文标题】:can I artificially slow the C trig functions for profiling purposes? 【发布时间】:2013-09-26 19:57:25 【问题描述】:

我正在使用 VS2012 Ultimate 在 C 中进行一些嵌入式开发。我使用平台抽象编译代码并在我的 PC 上对其进行模拟。该公司的另一个人使用带有 PPC 抽象层的 CodeWarrior,并在 MPC565 芯片上运行该东西。嵌入式芯片上的任务有时会超出 CPU 或时间界限。

代码中有很多三角函数。我知道嵌入式芯片上的触发执行很慢。如何夸大在我的 PC 上花在触发代码上的时间?我在想这样的事情:

#define cos(x) ( while(asiTimeMsec64() % 10 != 0); cos(x);)
#define sin(x) ( while(asiTimeMsec64() % 10 != 0); sin(x);)
#define tan(x) ( while(asiTimeMsec64() % 10 != 0); tan(x);)

但是,该代码并不完全有效。我收到关于我的cos 调用未返回数字的编译器错误。我想要某种自旋锁——不允许其他线程运行的东西。

我如何覆盖 math.h 三角函数以使它们人为地变慢?

【问题讨论】:

在错误的平台上进行分析不会告诉您任何有用的信息。您应该找到某种仿真平台(我不知道目标芯片是否存在),或者在您感兴趣的性能的实际平台上进行配置! 我会研究一些仿真平台。旧的 PowerPC 或 ARM 芯片可能非常相似。我想知道哪些易于分析... 【参考方案1】:

我不确定你的宏观想法是否会给你带来有用的结果,但你可以这样让它发挥作用:

void slowup( )

     while(asiTimeMsec64() % 10 != 0);


#define cos(x) (slowup(),cos(x))
...

或者,使用函数指针:

double slowup( double (*trig)( double ), double val )

     while(asiTimeMsec64() % 10 != 0);
     return (*trig)( val );


#define cos(x) slowup(cos, x)
...

【讨论】:

您希望 #define cos(x) (slowup(),cos(x)) 在所有编译器中工作还是仅在 GCC 中工作?我的 MSVC 似乎编译得很好,但它为 cos 函数返回了错误的值。 这很奇怪,因为逗号运算符被定义为首先计算第一个表达式并丢弃结果,然后计算第二个表达式并返回它的值。但老实说,我更喜欢第二种变体,它为您提供了更多改进 slowup() 的可能性 实际上,经过进一步审查,我认为#define 是有效的。我的数据正在通过其他途径遭到破坏。谢谢。【参考方案2】:

定义一个新函数:

 double slowed_cos(double x)
 
    SLOW_TRIG;

    return cos(x);
 

使用宏

 #define cos(Var) slowed_cos(Var)
 #define SLOW_TRIG while(asiTimeMSec64() % 10 !=0)

冲洗并为其他人重复。但是,您必须确保函数原型在任何使用默认函数和正确的 include 语句的地方都可用。

另外,验证参数的 math.h 函数规范。

【讨论】:

有什么方法可以通用地做到这一点,这样我就不必为每个现有的三角函数创建一个新函数了吗?【参考方案3】:

如果可以,请切换到其他 C 编译器,基本上是来自 mingw32 的 gcc。使用 gcc,您可以使用这个巧妙的技巧将库函数替换为您自己的代码,如 this answer 中所述。还要看看 Visual C 是否可以做类似的事情!

(附注:如果您坚持使用 Windows,那么我个人认为 C 开发最简单的方法是获取用于 mingw 的 Qt SDK,包括 Qt Creator,然后将其用于纯 C 项目,这是受支持的开箱即用。)


或者,获取 C 数学库的源代码,例如来自 this answer 的源,编辑它们以包含延迟,然后链接到它而不是标准数学库。使用 gcc,您根本不会使用 -lm 链接器开关,而是像任何其他库一样链接到自定义库。使用 VC 可能很简单,但默认情况下可能会链接数学库,在这种情况下,您需要了解如何禁用此默认链接。

此外,请确保禁用任何优化,这可能会为数学库函数创建自定义内联代码!虽然只是在调试模式下编译可能会实现这一点。


请注意,您的分析结果将非常粗糙。您可能应该对常规 C 优化设置以及测量需要添加到任何浮点指令的延迟量进行一些校准。但是,如果在真实设备上分析真实代码不是一种选择,并且这不仅适用于一个项目,而且将来也会有用,那么我可以看到为本地 PC 代码设置某种可比较环境的一些好处。

【讨论】:

以上是关于为了分析目的,我可以人为地减慢 C 三角函数的速度吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何减慢postgresql服务器的速度?

为啥我的 C 代码运行缓慢?

Qt:QVideoWidget 不显示并禁用应用程序中的所有按钮或极大地减慢应用程序的速度

如何在不减慢执行速度的情况下分析 Android 应用程序的执行?

Java 的 Profiler [几乎] 不会减慢分析代码的速度

如何有效地打开 30gb 的文件并处理其中的片段而不减慢速度?