【问题标题】:Confusing performance difference between Intel CPUs英特尔 CPU 之间令人困惑的性能差异
【发布时间】:2014-08-31 18:08:55
【问题描述】:

我正在 CPU 和 GPU 上实现不同的算法。令我感到奇怪的是,一个非常原始的示例(顺序 - 又名 1 个线程 - 创建具有 100*1024*1024 元素的数组的直方图)在服务器 CPU 上花费 200% - 300% 的时间(诚然,时钟频率略低并且比在工作站 CPU 上更早一代)。两台机器都使用 DDR3 内存,工作站上的 16GB 双通道 (FSB:DRAM 1:6) 和服务器上的 512GB 四通道 (FSB:DRAM 1:12),均以 800Mhz DRAM 时钟速率运行。

在我的工作站上,直方图计算需要 100ms(平均 90ms),而在服务器上平均需要 300ms,而在零星的情况下,它只需要 100ms(平均 90ms)强>150 毫秒。

我在两台机器上使用相同的构建(任何 CPU,首选 32 位,发布构建)。

关于另一个问题,为什么纯 64 位构建在两台机器上都至少慢 25%?

public static void Main(string[] args) {
    // the array size. say its 100 * 1024 ^ 2, aka 100 Megapixels
    const int Size = 100 * 1024 * 1024;

    // define a buffer to hold the random data
    var buffer = new byte[Size];

    // fill the buffer with random bytes
    var rndXorshift = new RndXorshift();
    rndXorshift.NextBytes(buffer);

    // start a stopwatch to time the histogram creation
    var stopWatch = new Stopwatch();
    stopWatch.Start();

    // declare a variable for the histogram
    var histo = new uint[256];

    // for every element of the array ...
    for (int i = 0; i < Size; i++) {
        // increment the histogram at the position
        // of the current array value
        histo[buffer[i]]++;
    }

    // get the histogram count. must be equal
    // to the total elements of the array
    long histoCount = 0;

    for (int i = 0; i < 256; i++) {
        histoCount += histo[i];
    }

    // stop the stopwatch
    stopWatch.Stop();
    var et1 = stopWatch.ElapsedMilliseconds;

    // output the results
    Console.WriteLine("Histogram Sum: {0}", histoCount);
    Console.WriteLine("Elapsed Time1: {0}ms", et1);
    Console.ReadLine();
}

服务器 CPU:

工作站 CPU:

【问题讨论】:

  • 在如此简单的循环中,粗略的 MHz 因子非常相关(并且 TurboBoost 会对结果产生很大影响)。但是请注意,您的缓冲区非常小。随着更大的数据大小,缓存大小也将决定结果。最后......不要忘记(工作)服务器上的基准测试非常随意。简而言之:这个测试是完全没用的,除非它是你需要测量的代码,如果它只是一个测试,那么它是没有意义的。
  • 好的。即使将电源计划更改为高性能,服务器也会慢 33%。我想这就是时钟频率和架构的区别......
  • @AdrianoRepetti 没那么没用。有问题的实际算法要复杂得多,我只是想出了我能想到的最简单的现实世界示例(计算直方图)。另外,我所说的服务器是指一个 19 英寸的设备,它在我的实验室里闲置着……所以它不是那么随意……顺便说一句,我以前从未听说过这个词:D
  • 我的意思是:性能由许多因素决定。 Brute GHz、内存速度、处理器架构、指令集、缓存大小和速度以及内核/CPU 的数量。如果你测量的东西不是你的代码(除非它经过微调以完全匹配它),那么结果不一定反映你用真实代码得到的结果。这就是标准基准非常明确的原因(我们有不同的基准)。用 256 个元素计算该直方图,然后用 1.000.000 个元素重试。现在让它平行。现在让我们让计算变得更复杂一些......
  • ...你会得到非常不同的结果。同样在 .NET 中,我们有 JIT,它可以使用扩展指令集(如果可用)。移动到 32 位到 64 位,您还将体验到完全不同的 JIT 实现。 IMO 有太多因素无法将它们投射到另一个上下文中(从假代码到真实代码)。关于服务器,我的意思是,如果它是一个服务器,它可能有自己的任务要执行,那么性能会因此而随时间变化(甚至更多)。

标签: c# performance intel cpu-architecture cpu-speed


【解决方案1】:

服务器 CPU 时钟显示为 1177 MHz,而工作站的时钟为 3691 MHz。这可以解释差异。

您的服务器似乎有一个 CPU 在没有压力的情况下会变慢,以节省能源,或者 BIOS 中的乘数设置为非常低的值。

【讨论】:

  • 现在这很奇怪......你是对的。它几乎可以完美地解释差异......奇怪......
  • 我的第一个想法是节能模式,使用戴尔服务器,我们能够将运行异常的 Java 应用程序的性能提高一倍。因此,是时候调整 Bios 设置了。
  • MHz 是一个因素(这里),因为循环简单且数据量小(只有 256 个单位)。更大的缓冲区缓存速度和大小也会影响结果(很多)。最后,由于 i7 TurboBoost,CPU 型号也很重要。
  • 默认情况下在服务器上使用“平衡”电源计划的愚蠢窗口。愚蠢的管理员不改变它。愚蠢的我没有看到它。
  • @lightxx 乐于助人:)
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 2021-11-18
  • 2011-03-09
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
相关资源
最近更新 更多