2015-12-11 40 views
0

只是爲了好玩,我試圖在python中實現一些算法來計算pi。我設法用Gauss-Legendre算法來做到這一點,並且我非常滿意。儘管如此,Python進程只使用一個核心(一個進程)。使用多個進程計算pi中的python

這是我實現的主要部分:

from decimal import * 
import math 
import time 

digit = 10000 
getcontext().prec = digit+1 

am, a, b, t, p = 0, 1, 1/Decimal(2).sqrt(), Decimal(1/4), 1 

while am != a: 

    am, bm, tm, pm = a, b, t, p 

    a = Decimal((am+bm)/2) 
    b = Decimal(am*bm).sqrt() 
    t = Decimal(tm-pm*(am-a)**2) 
    p = 2*pm 

pi = Decimal((a+b)**2/(4*t)) 
print(pi) 

我不知道是否有可能分配給每個進程A,B,T,P的計算。

我已經看過了多進程文檔,但看起來像它只適合像總和這樣的迭代任務(例如Ramanujan算法)。

感謝

+2

這裏的一般問題是如何平行這個算法。您可以輕鬆地讓每個CPU並行運行並執行相同的操作,但這顯然沒有用處。您希望每個CPU同時解決問題的*不同部分;那麼如何將這個算法細分爲單獨的任務,這些任務可以並行解決,並且可以加速計算最終結果?這個問題可能有點過於寬泛,無法在這裏回答。 – deceze

+0

其實我認爲它可以通過爲每個過程分配每個變量的計算來並行化。 – Matteo

+1

*如果*實際上會加快整體結果......與協調多個線程相關的一定開銷,並且該操作非常小以至於可能會超出該開銷。你當然可以試試看看... – deceze

回答

2

它似乎並不像您可以輕鬆地並行成更小的問題,可以相互獨立地運行問題。你可以創建一個線程來單獨執行它們中的每一個,但是你不能夠並行計算它們,因爲它們相互依賴(你必須等待a在b之前等待) 。

因此,如果您按原始順序運行它們,而線程必須等待對方,那麼它與按照上述順序運行它們沒有任何區別。