2015-03-20 2 views
0

У меня есть числовое интенсивное приложение и после поиска GFLOPS в Интернете я решил сделать свой собственный маленький тест. Я делал одно умножение матрицы нитей тысячи раз, чтобы получить вторую секунду выполнения. Это внутренней loop.fullСколько циклов для умножения float в C#

for (int i = 0; i < SIZEA; i++) 
    for (int j = 0; j < SIZEB; j++) 
     vector_out[i] = vector_out[i] + vector[j] * matrix[i, j]; 

Это было лет с тех пор я имел дело с FLOPS, поэтому я ожидал, чтобы получить что-то около 3 до 6 циклов в FLOP. Но я получаю 30 (100 MFLOPS), конечно, если я распараллеливаю это, я получу больше, но я этого не ожидал. Это может быть проблемой с dot NET. или это действительно производительность процессора?

Вот fiddle с полным эталонным кодом.

EDIT: Visual Studio даже в режиме деблокирования занимает больше времени для запуска, а сам исполняемый файл работает 12 циклов на FLOP (250 MFLOPS). Все еще есть какой-либо эффект ВМ?

+7

Учитывая, что C# компилируется в IL, который в конечном итоге будет преобразован в x86, x64 или различные архитектуры ARM (для названия, но 3), на этот вопрос не будет никакого единого ответа. Если производительность имеет решающее значение, C# не является подходящим инструментом для (этой части) задания. –

+0

@ Комментарий Damien_The_Unbeliever правильный (и должен быть ответ IMO). Это будет зависеть от целевой архитектуры. –

+0

@Damien и mura, вот в чем вопрос, сколько стоит архитектура и сколько это может быть точка net. В таком простом коде может случиться, что мы работаем с той же скоростью, что и железо. –

ответ

2

Ваш стендовый номер на самом деле не измеряет FLOPS, он выполняет некоторые операции с плавающей запятой и зацикливается на C#.

Однако, если вы можете изолировать свой код от повторения только операций с плавающей запятой, у вас все еще есть некоторые проблемы.

Ваш код должен включать некоторые «предварительные циклы», чтобы «джиттер разогрелся», поэтому вы не измеряете время компиляции.

Тогда, даже если вы сделаете это,

Вы должны скомпилировать в режиме выпуска с оптимизациями и выполнить тест от линии вводе команды на известной последовательной платформе.


Fiddle here

Вот мой альтернативный тест,

using System; 
using System.Linq; 
using System.Diagnostics; 

class Program 
{ 
    static void Main() 
    { 
     const int Flops = 10000000; 
     var random = new Random(); 
     var output = Enumerable.Range(0, Flops) 
         .Select(i => random.NextDouble()) 
         .ToArray(); 
     var left = Enumerable.Range(0, Flops) 
         .Select(i => random.NextDouble()) 
         .ToArray(); 
     var right = Enumerable.Range(0, Flops) 
         .Select(i => random.NextDouble()) 
         .ToArray(); 

     var timer = Stopwatch.StartNew(); 
     for (var i = 0; i < Flops - 1; i++) 
     { 
      unchecked 
      { 
       output[i] += left[i] * right[i]; 
      } 
     } 

     timer.Stop(); 
     for (var i = 0; i < Flops - 1; i++) 
     { 
      output[i] = random.NextDouble(); 
     } 

     timer = Stopwatch.StartNew(); 
     for (var i = 0; i < Flops - 1; i++) 
     { 
      unchecked 
      { 
       output[i] += left[i] * right[i]; 
      } 
     } 

     timer.Stop(); 

     Console.WriteLine("ms: {0}", timer.ElapsedMilliseconds); 
     Console.WriteLine(
      "MFLOPS: {0}", 
      (double)Flops/timer.ElapsedMilliseconds/1000.0); 
    } 
} 

На моей виртуальной машине я получаю результаты, как

ms: 73 
MFLOPS: 136.986301... 

Примечание, я должен был растет в цене так как количество операций значительно превышает 1 миллисекунду.

+0

Я очень ценю ваш ответ.Я просто хочу уточнить, что, как и вы, я только рассчитал внутренний цикл. –

+0

@ArturoHernandez в вашем связанном примере вы вызываете 'Stopwatch.StartNew()', который строит и запускает таймер немедленно, последующий '_timer.Start()' не сбрасывает таймер. Вы можете проверить замечания здесь https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.start%28v=vs.110%29.aspx – Jodrell

+0

true, но только проблема при первом итерации из 100000. После исправления получил тот же ответ. Мне все равно нужно запустить ваш код. Tks !!!! –

Смежные вопросы