嗨這是一個非常具體的問題,所以我希望StackOverflow的是爲所有的編程語言,而不是僅僅的JavaScript/HTMLmpi4py進程和線程
我寫在MPICH2多程序(流行的消息傳遞接口) 。我的程序是用Python編寫的,因此我使用MPI4Py Python綁定。 MPI最適合無共享內存的情況,因此它不適合多核編程。要使用我的5節點集羣的完整4個內核,我進一步使用線程。但是,我注意到使用線程實際上減慢了我的模擬。我的計劃是行的代碼幾萬,所以我不能把它所有,但這裏是這是造成問題
from threading import Thread
...
threadIndeces=[[0,10],[11,20],[21,30],[31,40]] #subset for each thread
for indeces in treadIndeces:
t=Thread(target=foo,args=(indeces,))
t.start()
同樣的片段,我保證以後加入線程。如果我運行它沒有線程,只需撥打foo
所有的參數,它大約快10-15倍。當我記錄多線程版本的時間時,呼叫t=Thread(target=foo,args=(indeces,))
中線程的創建需要大約0.05秒,加入同樣需要0.05秒,但t.start()
調用需要高達0.2秒。
是start()
昂貴的電話?我應該改變我的方法嗎?我想保持一堆線程,而不是每次迭代都創建新線程,但似乎並不是造成速度減慢的原因。
此外,櫃面有人想知道的foo
的複雜性,這裏是它被調用i
時間爲indeces
每次迭代的功能(非離散時間)之一:
def HD_training_firing_rate(HD_cell):
"""During training, the firing rate is governed by the difference between the
current heading direction and the preferred heading direction. This is made
to resemble a Gaussian distribution
"""
global fabs
global exp
global direction
#loop over twice due to concurrent CW and CCW HD training
for c in [0,1]:
d=direction[c]
dp=HD_cell.dp #directional preferance
s_d=20.0 #standard deviation
s_i=min(fabs(dp-d),360-fabs(dp-d)) #circular deviation from preferred dir.
HD_cell.r[c]=exp(-s_i*s_i/(2*s_d*s_d)) #normal distribution
+1 - 我不確定這裏的線程優點是什麼。看起來每個線程都在做一些完全獨立的事情?如果是這樣,使用線程優於MPI有什麼優勢?在查找性能問題方面,您最好將大規模分解排除在等式之外,並且只需儘可能快地在一個共享內存盒上運行,然後再重新引入跨節點MPI東東。如果你被困在python的整個事情中,你最終可能會發現基於過程的方法,如多處理性能優於線程。 – 2011-04-07 23:01:45
@Drew Hall:我最初使用C語言,但是這種語言非常繁瑣,Python更易於使用。 – puk 2011-04-07 23:53:31
@Drew Hall,Jonathan Dursi:人們似乎忘記了MPI假定沒有共享內存,而線程則允許共享內存。這裏的問題是全局變量。我做了很多縮放,需要計算全局最大值。使用線程可以很容易地實現,事實上它是微不足道的。如果我使用MPI並在單個節點上運行多個進程,那麼他們將必須傳達這些全局最大值。溝通是,原諒我的語言,屁股疼痛。 – puk 2011-04-07 23:57:57