嗨这是一个非常具体的问题,所以我希望StackOverflow适用于所有编程语言而不仅仅是javascript / html
我在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()
是一个昂贵的电话吗?我应该改变我的做法吗?我考虑过保留一个线程池,而不是每次迭代都创建新的线程,但它看起来并不像
t=Thread(target=foo,args=(indeces,))
正在导致减速。
此外,如果有人想知道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
答案 0 :(得分:4)
如果你需要线程,python可能不是你最好的选择,因为Global Interpreter Lock阻止了真正的并发。另请参阅Dave Beazly's disturbing talk。
最好只运行20个进程以保持4个核心和5个节点忙碌,并且只需使用MPI进行所有通信。
如果你真的致力于联合线程/消息传递方法,你可能想要考虑C或C ++(或者我敢说Fortran?)Python会产生大量开销。