mpi4py包含进程和线程

时间:2011-04-07 22:42:37

标签: python multithreading mpi

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

1 个答案:

答案 0 :(得分:4)

如果你需要线程,python可能不是你最好的选择,因为Global Interpreter Lock阻止了真正的并发。另请参阅Dave Beazly's disturbing talk

最好只运行20个进程以保持4个核心和5个节点忙碌,并且只需使用MPI进行所有通信。

如果你真的致力于联合线程/消息传递方法,你可能想要考虑C或C ++(或者我敢说Fortran?)Python会产生大量开销。