【问题标题】:Difference between glibC and bioniCglibC 和 bioniC 的区别
【发布时间】:2012-11-15 12:24:49
【问题描述】:

您好,我在优化方面遇到了一些问题。
我尝试使用内置函数编译 gcc 测试之一:

#include <stdio.h>

#ifdef HAVE_C99_RUNTIME
double test1 (double x)
{
  return __builtin_pow (x, 1/3);
}

double test2 (double x)
{
  return __builtin_pow (x, 4./3.);
}

double test3a (double x)
{
  return __builtin_pow (x, 5./3.);
}

double test3b (double x)
{
  return __builtin_pow (x, -5./3.);
}

double test4 (double x)
{
  return __builtin_pow (x, 7./3.);
}
#endif

我尝试用以下 2 种方式编译它:
1 种方式:
gcc -mglibc -O -ffast-math -std=c99 -fno-ident -S -o builtins-58.s
并且在输出汇编文件中所有call pow 都更改为call cbrt - 这是预期的

2路:
gcc -mbionic -O -ffast-math -std=c99 -fno-ident -S -o builtins-58.s
使用-mbionic 而不是-mglibc 我得到了call pow 的输出

有人知道optmimizationbuiltin 函数在Bionic 中是如何工作的吗

【问题讨论】:

  • @AmigableClarkKant 为什么对 glibc 和仿生的内置函数优化不同?
  • 函数返回的值是否相同?
  • 两者的源代码都是现成的。为什么不看看呢?
  • @HansPassant 在使用内置数学函数的优化选项的情况下我找不到区别
  • @Pepelac,那么你应该阅读这些库的源代码。它可能是不同的。此外,编译器如何选择将源代码转换为机器指令完全取决于编译器。如果你切换编译器,你可能会得到 another 输出。

标签: c optimization glibc built-in bionic


【解决方案1】:

这是因为在 gcc 4.7 中我们进行了特殊检查(检查 TARGET_C99_FUNCTIONS) 在builins.def 文件中,其中定义了所有内置函数。

在另一个文件中,我们有: define TARGET_C99_FUNCTIONS (OPTION_GLIBC)

这些检查检查库,如果没有glibc,那么我们就没有cbrt 函数。 所以我们无法将pow 转换为cbrt,这是根本原因。

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 2013-04-26
    • 2022-12-04
    • 1970-01-01
    • 2012-09-28
    • 2023-03-17
    • 2013-08-07
    • 2011-10-20
    相关资源
    最近更新 更多