我是并行化和MPI的新手。我正在学习并尝试使用mpi4py。目前我正在尝试优化一个方法的性能,该方法在一个区间内随机采样一个期望的点(满足条件)。
为了给你一个详细的想法,我创建了一个类似于我的程序的示例程序。该程序的目的是在9.9999和10.0之间输出20个数字。这是通过从[0.0,1.0]中随机抽样并将其乘以10来完成的(通过迭代以极小的数量变化)。
以下是提供的功能和评论。
import numpy as np
import time
def fit(iterations, value):
array = []
sample = None
# This runs for a fixed number of iterations. For one iteration one sample needs to go to the accumulator array (in this case i.e array)
for iteration in range(iterations):
while True:
arbit = np.random.uniform(0,1)
# The main condition for sampling. In my original program this is bound to change with each
# iteration. so I made it depend on the iteration in this test program.
if((10-0.000001*(iteration))*arbit > value):
sample = 10*arbit
break
# The accumulation of accepted sample. If there are n iterations, n samples are expected.
array.append(sample)
print "Result: "+ str(array)
if __name__ == '__main__':
startTime = time.time()
fit(20, 9.9999)
elapsedTime = time.time() - startTime
print "\n"+"time taken: "+str(elapsedTime)+"\n"
正如您所看到的那样,所有动作都发生在fit()方法的while循环中。我想要做的是利用并行化和mpi4py来加快这种方法。例如,我想启动n个进程,当while循环到来时,并行触发进程,并且首先找到所需的值,然后我想将该值添加到累加器数组并中止所有其他进程。我想在下一次迭代中再次继续这个例程,依此类推,直到方法结束。这样的事情可能吗?如果不是这样,在上面的函数中我可以使用其他什么方式进行并行化?
谢谢
答案 0 :(得分:1)
并行化背后的一般思想很大程度上取决于应用程序。您可以使您的流程越独立,就越好。进程间通信增加了麻烦和开销。如果您的进程驻留在不同的计算机中,则尤其如此。
使用上面的示例代码,使其并行的简单方法是通过迭代将其拆分。您将拥有一个迭代列表和一些工作进程,这些进程一次会在一个迭代周期中流失。即使您需要按顺序获得结果,也可以在之后对其进行排序。所以,如果你经历迭代0,1,2,3 ...或者例如,它并不重要。 17,3,14,1,5 ......
但您似乎建议将每个迭代周期拆分为并行循环以寻找合适的数字。这是可能的(但要确保在不同的进程中使用不同的随机种子,否则它们会复制相同的序列),并且所需的通信非常简单:
有几种方法可以实现这一目标。上面的描述假设工人是活跃的,但通常更容易制造愚蠢的工人,这些愚蠢的工人只能在他们完成工作时开始工作并在他们被告知时开始做事。在这种情况下,您只需要主站和从站之间的点对点通信。
在任何情况下,工作人员在工作时都必须定期轮询通信,从性能的角度来看,轮询间隔很重要。如果您经常轮询,则会浪费时间轮询。如果你的轮询间隔很长,那么当事情发生时你会浪费时间。主人可以使用阻止通信,只是坐下等待工人说出来,这种情况会更容易。
因此,您可以在工作人员之间使用广播,或者您可以使用主从通信,或者您可以使用这些的组合。每种方法都有优缺点,最佳解决方案取决于您的应用和要求。 (我通常选择最简单的解决方案,只有在有明确需要的情况下才能编写和优化。)
我只是表面上熟悉MPI,但你的问题的答案是肯定的,可以用MPI完成。