嗨这是一个非常具体的问题,所以我希望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