包含进程和线程的mpi4py

2024-06-06 05:36:29 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,这是一个非常具体的问题,所以我希望StackOverflow适用于所有编程语言,而不仅仅是javascript/html

我正在用MPICH2(流行的消息传递接口)编写一个多程序。我的程序是用Python编写的,所以我使用mpi4python绑定。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秒,join同样需要0.05秒,但是t.start()调用则需要0.2秒。在

是一个昂贵的电话吗?我应该改变我的方法吗?我想保留一个线程池,而不是每次迭代都创建新的线程,但它看起来不像 t=Thread(target=foo,args=(indeces,))是导致减速的原因。在

另外,如果有人想知道foo的复杂性,这里有一个函数,它在每次迭代(非离散时间)中被调用i次:

^{pr2}$

Tags: 代码程序targetforfoo时间argsjavascript
1条回答
网友
1楼 · 发布于 2024-06-06 05:36:29

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

您最好只运行20个进程来保持4个核心和5个节点的繁忙,并且只使用MPI进行所有通信。在

< Python在你想考虑C或C++的大铁中会产生很多开销(或者我敢说FORTRAN?)如果你真的致力于联合线程/消息传递方法。在

相关问题 更多 >