2013-09-24 30 views
5

遇到過一種情況,一個簡單的.net fibonniacci代碼在特定的一組服務器上速度較慢,唯一明顯不同的是CPU。 AMD皓龍處理器6276 - 11秒 英特爾至強XPU E7-4850 - 7秒.net代碼在AMD皓龍CPU上速度較慢

代碼符合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

除了檢查你的電源管理,我認爲Iain是正確的,這是更多的SO問題。 – ITHedgeHog

+2

兩臺機器上的相同默認cpu親和力設置?而...爲什麼32位? –

+0

@MathiasR。Jessen - 這很有趣,因爲我將CPU親和力設置爲單個CPU,並且我現在得到7秒 – Rubans

回答

6

正如我們在評論中所建立的那樣,您可以通過將進程固定到AMD Opteron機器上的特定處理器來解決此性能問題。

點擊這個不是真的在主題上的問題,我決定看看單核釘扎會產生如此差異(從11秒到7秒似乎有點極端)的可能情況。

最合理的答案是不是革命性的:

AMD皓龍系列僱用HyperTransport在所謂的NUMA架構,而不是傳統的FSB,你會發現英特爾的SMP的CPU(至強4850含稅)

我的猜測是,這種症狀源於這樣一個事實,即NUMA體系結構中的單個節點具有單獨的緩存,而不是Intel處理器緩存共享的CPU。換句話說,當連續計算在Opteron上的節點間移動時,緩存被刷新,而像Xeon 4850這樣的SMP體系結構中的處理器之間的平衡不會產生這種影響,因爲緩存是共享的。在.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,我發現這個一個.NET包裝一個promissing CodePlex項目,以及:http://multiproc.codeplex.com/

我絕不附近資格是教你如何利用這一技術,但這應該指向你正確的方向。

+0

我會看看這個,但是你只是用我不知道的東西吹動我的思想,所以現在我真的必須閱讀你的迴應 – Rubans

+0

@Rubans我認爲我也吹噓了自己的想法:P –

相關問題