2013-09-24 7 views
5

столкнулись с ситуацией, когда простой код .net fibonniacci работает медленнее на определенном наборе серверов, и единственное, что явно отличается, это процессор. AMD Opteron Процессор 6276 - 11 секунд Intel Xeon XPU E7 - 4850 - 7 secs.net код медленнее на процессоре AMD Opteron

Код выполнен для x86 и используется .NET framework 4.0. -Настольные скорости между обоими похожими, и на самом деле тесты PassMark дают более высокие оценки для AMD. -Вы пробовали это на других серверах AMD в ферме, и время идет медленнее. -Даже мои локальные машины I7 быстрее запускают код.

код Fibonnacci:

class Program 
{ 
    static void Main(string[] args) 
    { 
     const int ITERATIONS = 10000; 
     const int FIBONACCI = 100000; 

     var watch = new Stopwatch(); 
     watch.Start(); 


     DoFibonnacci(ITERATIONS, FIBONACCI); 

     watch.Stop(); 

     Console.WriteLine("Total fibonacci time: {0}ms", watch.ElapsedMilliseconds); 
     Console.ReadLine(); 
    } 

    private static void DoFibonnacci(int ITERATIONS, int FIBONACCI) 
    { 
     for (int i = 0; i < ITERATIONS; i++) 
     { 
      Fibonacci(FIBONACCI); 
     } 
    } 

    private static int Fibonacci(int x) 
    { 
     var previousValue = -1; 
     var currentResult = 1; 

     for (var i = 0; i <= x; ++i) 
     { 
      var sum = currentResult + previousValue; 
      previousValue = currentResult; 
      currentResult = sum; 
     } 

     return currentResult; 
    } 

} 

Любые идеи о том, что, возможно, происходит?

+0

Помимо проверки правильности управления питанием, я думаю, что Иэн прав, это больше вопрос SO. – ITHedgeHog

+2

Одинаковые настройки близости процессора по умолчанию на обеих машинах? И ... почему 32-битный? –

+0

@ MathiasR.Jessen - это интересно, потому что я установил близость процессора к одному процессору, и теперь я получаю 7 секунд. – Rubans

ответ

6

Как мы уже установили в комментариях, вы можете обойти эту производительность, привязав процесс к конкретному процессору на машинах AMD Opteron.

Поднявшись на этот вопрос не по-настоящему по теме, я решил взглянуть на возможные сценарии, когда одноядерное пиннинг будет иметь такое значение (от 11 до 7 секунд кажется немного экстремальным).

Наиболее вероятным ответом является не то, что революционер:

серии нанимают AMD Opteron HyperTransport в так называемой NUMA архитектуры, вместо традиционного ФСБ, как вы найдете на Intel в SMP процессора (Xeon 4850 в комплекте)

Я предполагаю, что этот симптом связан с тем, что отдельные узлы в архитектуре NUMA имеют отдельный кеш, в отличие от процессора Intel, в котором используется общий кэш процессора.

Другими словами, когда последовательные вычисления сдвигаются между узлами на Opteron, кеш сбрасывается, тогда как балансировка между процессорами в архитектуре SMP, такой как Xeon 4850, не оказывает такого влияния, поскольку общий доступ к кешу.

Настройка сродства в .NET довольно легко, просто выбрать процессор (давайте просто взять первый для простоты):

static void Main(string[] args) 
{ 
    Console.WriteLine(Environment.ProcessorCount); 
    Console.Read(); 

    //An AffinityMask of 0x0001 will make sure the process is always pinned to processer 0 
    Process thisProcess = Process.GetCurrentProcess(); 
    thisProcess.ProcessorAffinity = (IntPtr)0x0001; 

    const int ITERATIONS = 10000; 
    const int FIBONACCI = 100000; 

    var watch = new Stopwatch(); 
    watch.Start(); 


    DoFibonnacci(ITERATIONS, FIBONACCI); 

    watch.Stop(); 

    Console.WriteLine("Total fibonacci time: {0}ms", watch.ElapsedMilliseconds); 
    Console.ReadLine(); 
} 

Хотя я уверен, что это не очень умный в среде NUMA ,

Windows 2008 R2 имеет some cool native NUMA functionality, и я нашел перспективно Codeplex проект с .NET обертка для этого, а также: http://multiproc.codeplex.com/

Я ни в коей мере около квалифицирован, чтобы научить вас, как использовать эту технологию, но это должно указывать вам в правильном направлении.

+0

. Я посмотрю на это, но вы просто взорвали мои мысли тем, о чем я не знал, поэтому сейчас мне действительно нужно будет прочитать ваш ответ – Rubans

+0

@Rubans Я думаю, что я тоже взорвал свой собственный ум: P –

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

  • Нет связанных вопросов^_^