【问题标题】:GCC compile-time floating point optimizationGCC 编译时浮点优化
【发布时间】:2012-03-04 01:29:27
【问题描述】:

我正在为 AVR 平台开发,我有一个问题。我不希望浮点库与我的代码链接,但我喜欢使用范围为 0.0 ... 1.0 而不是 0...255 和 0...1023 的模拟值的概念,这取决于偶数我是使用端口作为输入还是作为输出。

所以我决定将输入/输出函数的参数分别乘以 1023.0 和 255.0。现在,我的问题是:如果我这样实现划分:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))

GCC(打开 -O3 标志)是否会将编译时浮点乘法(在编译时已知并转换为整数类型)优化为整数运算? (我知道当使用这些带有非常量参数的宏时,优化是不可能的;我只想知道在其他情况下是否会这样做。)

【问题讨论】:

  • 这不应该是乘法,而不是除法吗? (analog_out(7, 0.5) 变为将 0.5*255 写入端口 7,而不是从 1/510 中截取的 0 写入)...
  • 试试看吧! gcc -S 将生成程序集转储。您可能需要-O2 -ffast-math,而不是-O3-O3 启用几乎总是净失败的优化,例如过度激进的内联;它旨在用于一个文件您的程序花费了 90% 的时间)。
  • 嗯,它是一个库,所以程序将在其中花费 90% 以上的时间;)但无论如何,谢谢你的想法。
  • 你们为什么无缘无故地否决这个问题?
  • 解释该死的反对票!

标签: c optimization gcc floating-point avr


【解决方案1】:

如果您提供位作为数字文字,GCC 应该始终进行常量折叠。 如果您希望编译器强制执行 constness,您可以使用以下方法:

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0))
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0)))

【讨论】:

    【解决方案2】:

    一般来说,我认为gcc -O2 会在编译时对常量进行所有算术运算。
    它不会将其转换为整数算术 - 只是转换为常量整数。

    依赖它可能很危险,尤其是在其他人维护代码的情况下。将非常量参数传递给宏导致错误的情况并不好。

    【讨论】:

    • 它不会导致错误,我只是希望它被优化掉。
    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多