2013-02-19 45 views
0

我正在使用MPI對一個使用數值積分的PI進行非常簡單的計算,並使用一些數學規則,最終將計算結果轉換爲總和,其格式爲:使用MPI進行簡單計算,不同數量的進程會得到不同的結果?

PI =Σ(f(i)) ,我從1到100000開始,而f(i)是一個函數,返回一些基於i的double型值。

編程時,我可以將總和轉換爲for循環,迭代100000次。使用p處理器的MPI,我將for循環分成p段,每個處理器得到100000個/ p個循環(假設100000%p = 0)。之後使用MPI_Reduce,MPI_SUM來收集這些子結果並將它們相加得到最終結果。

然而,在使用過程不同數量的我,最後的結果會略有不同,我的最終結果PI有12位精度,結果開始大約爲第7位後的不同。

我不能得到答案,爲什麼結果會不同,因爲在我心中,它只是不正是相同的任務沒有母校的任務如何分配。

非常感謝您的幫助!

+0

我認爲你的問題得到了切斷 – pyCthon 2013-02-19 02:35:18

+0

我們對此深感抱歉,我只是重新編輯我的問題。 – Bpache 2013-02-19 02:53:31

+0

你能顯示你的代碼嗎? – tune2fs 2013-02-19 08:36:08

回答

2

浮點運算的數值結果通常取決於它們的執行順序。要理解這一點,您首先需要了解如何由計算機代表floating point numbers。一個例子是添加不同大小的數字:由於指數不同,其中一個將被截斷(例如舍入)。你可以看到這個例子:

double small, result1, result2; 
    small = 1./3000.; 
    result1 = 0.; 
    for (int i = 0; i < 10000; i++) 
      result1 += small; 

    result2 = 0.; 
    for (int i = 0; i < 100; i++) { 
      double tmp = 0.; 
      for (int j = 0; j < 100; j++) 
        tmp += small; 
      result2 += tmp; 
    } 
    printf("result1= %.17g, result2= %.17g\n", result1, result2); 

通過首先將數字添加到臨時結果,更少的截斷髮生。這很可能是這樣的事情發生在你的代碼中。

+0

非常感謝。非常清楚 – Bpache 2013-02-19 11:43:22

相關問題