6

我发现在我用于科学计算的全新无头工作站机器上,在 Ubuntu 下运行一些计算代码的性能相当差。我注意到在 Ubuntu 上运行一些稍微复杂的代码的速度与在我用于开发的旧 Mac 笔记本电脑上运行的速度不同。但是,我设法将其提炼成一个非常简单的示例,该示例仍然比我的旧机器表现出不那么出色的改进:

#include <stdio.h>
#include <math.h>

int main() {
        double res = 0.0;
        for(int i=1; i<200000000; i++) {
                res += exp((double) 100.0/i);
        }
        printf("%lf", res);
        return(0);
}

现在,Mac 是一台运行 OS X 10.5 的 2.4GHz Core 2 Duo MacBook Pro 近 5 年,运行此代码大约需要 6.8 秒。然而,在运行 Ubuntu 11.10 的全新 3.4GHz Core i7 Dell 上,大约需要 6.1 秒!有人能告诉我这里发生了什么吗,因为一台使用了将近 5 年的笔记本电脑与全新的台式工作站相差不到 10% 是荒谬的?更荒谬的是,我可以看到 Core i7 使用监控工具加速到近 4GHz!

Mac 编译:

gcc -o test test.c -std=gnu99 -arch x86_64 -O2

Ubuntu编译:

gcc -o test test.c -std=gnu99 -m64 -O2 -lm

谢谢,

路易斯

4

6 回答 6

3

一台使用了将近 5 年的笔记本电脑距离全新的台式机工作站不到 10%,这是荒谬的

请记住,您正在对一个特定函数( exp) 进行基准测试。我们真的不知道exp()您要进行基准测试的函数的两个实现是否相同(一个比另一个优化得更好并非不可想象)。

如果您要对不同的函数进行基准测试,结果可能会大不相同(可能更符合您的期望;或者不符合)。

如果exp()确实是您实际应用程序的瓶颈,则一种可能性是考虑使用快速近似值。这是一篇提供这种近似的论文:A Fast, Compact Approximation of the Exponential Function

于 2012-02-23T17:40:19.247 回答
1

正如其他人指出的那样,您只是将一个数学库实现exp( )与另一个进行基准测试。如果您需要 Linux 上的高质量数学库,我建议您查看 Intel 的编译器工具(它带有一组出色的库);它们也可用于 OS X 和 Windows。

于 2012-02-23T18:57:48.630 回答
1

尝试打开该-ffast-math选项。这可能会给你一个不那么迂腐正确的exp(). 那么问题是您是否想要可能产生的潜在错误答案。

于 2012-02-24T23:17:16.437 回答
0

您正在比较苹果和橙子,对于 Mac,您允许进行特定于架构的优化,而对于 ubuntu 则不允许。使用-O3 -march=native两者进行公平比较。

于 2012-02-23T17:49:44.537 回答
0

cpu 周期数的差异仅为 30%。鉴于我们不确切知道编译器生成了什么代码,我不会说这很荒谬。新 cpu 的大部分性能提升是内核数量,而您的代码没有利用它。

尝试展开循环也可能很有趣。速比可能会改变。

int main() {
    double res0 = 0.0;        
    double res1 = 0.0;        
    double res2 = 0.0;        
    double res3 = 0.0;        
    double res4 = 0.0;        
    for(int i=1; i<200000000; i+=5) {
            res0 += exp((double) 100.0/i);
            res1 += exp((double) 100.0/(i+1));
            res2 += exp((double) 100.0/(i+2));
            res3 += exp((double) 100.0/(i+3));
            res4 += exp((double) 100.0/(i+4));
    }
    double res=res0+res1+res2+res3+res4;
    printf("%lf", res);
    return(0);
}
于 2012-02-23T19:06:44.817 回答
0

有几件事要尝试:

  • 确保您的 CPU 设置为在实验期间以全速固定运行。它可能会上下切换,这会增加很多开销
  • 使用 将测试程序固定到一个核心taskset,这样操作系统调度程序就不会迁移它
于 2012-02-23T18:43:08.667 回答