【问题标题】:Apple math library vs others in CApple 数学库与 C 中的其他库
【发布时间】:2016-12-11 01:14:20
【问题描述】:

最近我想知道在 C 中计算 tanh(x) 函数的速度有多快。所以我编写了以下简单代码:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
 
int main() {
    clock_t elapsed1 = -clock();
    double x = 3.14;
    for(int i = 0; i < 100000000; i++)  {
        x = tanh(x);
    }
    elapsed1 += clock();
    printf("X = %f\n", x);
    printf("time %lu\n", elapsed1);
    return 0;
}

我已经在我的 CPU 上运行它(单线程 2.5GHz)并使用 Ubuntu 15.04 获得了 370 000 的时间。我的朋友有 MacOS 10.10.3(单线程 1.4GHz),她得到了 180 000。

我使用以下代码编译它:gcc -std=c99 -Wall -Wextra -pedantic -lm
她:gcc -std=c99 -Wall -Wextra -pedantic

我不明白较慢的 CPU 怎么能以快两倍的速度计算如此幼稚的代码 sn-p?为什么苹果不需要-lm?有什么关系吗?

如果 Apple 有一些很棒的数学库,那么在基本的 C 编译器/库中实现它们是否困难?为什么?

编辑:

确切地说:我的 CPU 比她更新更强大,所以应该没有问题。

我还在其他机器上运行过代码,它们的速度也较慢。

【问题讨论】:

  • 可能取决于 L1 缓存大小、流水线长度等。您应该让我们知道您在两台机器上的 CPU 类型。
  • 计算的值是否相同?
  • 是的,确实如此。我有 Intel Core i7-4710MQ,不知道她有什么 CPU,但它是 core i5
  • 您正在使用两种不同的硬件和软件环境,并尝试对它们进行基准测试。可能是 CS 中最具挑战性的任务之一。这个等式中的变量太多了。
  • 可能还想尝试开启优化(例如:-O2)。

标签: ios c math gcc optimization


【解决方案1】:

我可能会给出简短的探索步骤,这里没有神奇的解决方案,但是:

  1. 您的代码非常适合编译器优化。比如说,使用 O2 可以将其折叠为单个指令。这就是为什么如果一个编译器是用不同的规范构建的(比如默认的 -Og 而不是默认的 -O0)或者只是更新/旧的,那么结果将会有很大的不同。所以你需要明确指定-O0 选项并确保编译器版本相同

  2. 编译器后端可能内置了 tanh 函数,因此请在选项中添加 -fno-builtin

  3. libc 版本可能不同——您需要确定这里和那里使用的 libc 版本到底是什么。

  4. 双精度本身可能会有所不同,例如 80 位双精度与 64 位双精度,然后以某些性能换取精度。尝试改用浮点版本——浮点实现几乎总是 32 位的。

  5. libc 函数中可能存在特定于架构的内置函数。假设 ia64 glibc 后端提供高度优化的 tanh 而 i386 不提供

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多