2013-09-24 37 views
5

Napotkali sytuację, w której prosty .net fibonniacci jest wolniejszy na określonym zestawie serwerów i jedyną rzeczą, która jest oczywiście inna, jest procesor. AMD Opteron 6276 - 11 sek Intel Xeon XPU E7 - 4850 - 7 sek. Kod spowolniony w procesorze AMD Opteron CPU

Code jest spełnione dla x86 i przy użyciu .NET Framework 4.0. -Clock prędkości między nimi jest podobny i w rzeczywistości testy PassMark dają wyniki highesr dla AMD. - Próbowano tego na innych serwerach AMD w farmie, a czasy są wolniejsze. -Nawet moje lokalne maszyny I7 szybciej uruchamiają kod.

kod 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; 
    } 

} 

Wszelkie pomysły na to, co może być grane?

+0

Poza sprawdzaniem zarządzania energią, myślę, że Iain ma rację, jest to raczej pytanie WSTĘPNE. – ITHedgeHog

+2

Te same domyślne ustawienia koligacji procesora na obu komputerach? I ... dlaczego 32-bitowe? –

+0

@MathiasR.Jessen - jest to interesujące, ponieważ ustawiłem powinowactwo procesora do pojedynczego procesora i otrzymałem 7 sekund teraz – Rubans

Odpowiedz

6

Jak ustaliliśmy w komentarzach, możesz obejść to bash wydajności, przypinając proces do określonego procesora na maszynach AMD Opteron.

W odpowiedzi na to niezupełnie na temat pytanie, zdecydowałem się rzucić okiem na możliwe scenariusze, w których jedno rdzeń przypieczętowałby taką różnicę (od 11 do 7 sekund wydaje się nieco ekstremalny).

Odpowiedź Najbardziej prawdopodobne jest, że rewolucyjny:

Seria zatrudniać AMD Opteron HyperTransport w tak zwanej architekturze NUMA, zamiast tradycyjnego FSB jak można znaleźć na Intela o znaczącej pozycji rynkowej CPU (Xeon 4850 zestawie)

Domyślam się, że ten symptom wynika z faktu, że poszczególne węzły w architekturze NUMA mają osobną pamięć podręczną, w przeciwieństwie do procesora Intel, w którym współużytkowana jest pamięć podręczna procesora.

Innymi słowy, gdy kolejne obliczenia przesuwają się między węzłami na serwerze Opteron, pamięć podręczna jest opróżniana, podczas gdy równoważenie między procesorami w architekturze SMP, takie jak Xeon 4850, nie ma takiego wpływu, ponieważ pamięć podręczna jest współużytkowana.

Ustawienie powinowactwa w .NET jest dość proste, wystarczy wybrać procesor (niech po prostu wziąć pierwszy jeden dla uproszczenia):

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(); 
} 

Chociaż jestem prawie pewien, że to nie jest bardzo inteligentny w środowisku NUMA .

Windows 2008 R2 ma some cool native NUMA functionality i znalazłem obiecującą projekt codeplex z obwolutą NET to także: http://multiproc.codeplex.com/

jestem w żaden sposób koło kwalifikacje do nauczania, jak wykorzystać tę technologię, ale to powinno wskazać ci właściwy kierunek.

+0

Spójrz na to, ale po prostu dmuchnąłeś mi w głowę z rzeczami, o których nie wiedziałem, więc teraz naprawdę będę musiał przeczytać twoja odpowiedź – Rubans

+0

@Rubans Myślę, że dmuchnąłem także mój własny umysł: P –