Я нахожусь в процессе реализации различных алгоритмов на процессорах и графических процессорах. Что меня поразило странным, так это то, что очень примитивный пример (последовательно — он же 1 поток — создание гистограммы массива с 100 * 1024 * 1024 элементами) занимает на 200% - 300% больше времени на процессоре сервера (который, по общему признанию, немного ниже по тактовой частоте). и на одно поколение старше), чем на ЦП рабочей станции. Обе машины используют память DDR3, двухканальную память 16 ГБ на рабочей станции (FSB:DRAM 1:6) и четырехканальную память 512 ГБ на сервере (FSB:DRAM 1:12), обе работают с тактовой частотой DRAM 800 МГц.
На моей рабочей станции расчет гистограммы занимает ‹100 мс (в среднем 90 мс), тогда как на сервере он занимает в среднем 300 мс, а в спорадических случаях это занимает всего около 150 мс. .
Я использую одну и ту же сборку на обеих машинах (любой процессор, предпочитаю 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();
}
ЦП сервера:
ЦП рабочей станции: