【发布时间】: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