Parallel processing 使用mpi4py实现包含随机采样的循环的并行化

Parallel processing 使用mpi4py实现包含随机采样的循环的并行化,parallel-processing,mpi,cluster-computing,multicore,mpi4py,Parallel Processing,Mpi,Cluster Computing,Multicore,Mpi4py,我不熟悉并行化和MPI。我正在学习和试验mpi4py。目前,我正在尝试优化一种方法的性能,该方法在一个时间间隔内随机采样一个期望点(满足一个条件) 为了给你一个详细的想法,我创建了一个与我的程序类似的示例程序。该程序的目标是输出9.9999和10.0之间的20个数字。这是通过从[0.0,1.0]中随机取样并将其乘以10来实现的(通过迭代以无穷小的数量变化) 以下是提供的功能和注释 import numpy as np import time def fit(iterations, value)

我不熟悉并行化和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,2,3。。。或例如17、3、14、1、5

但您似乎建议将每个迭代周期拆分为并行循环,以寻找合适的数量。这是可能的(但请确保在不同的进程中使用不同的随机种子,否则它们将复制相同的序列),并且所需的通信非常简单:

  • 工作进程需要能够发送“我找到了!”
  • 当另一个进程发送“我找到它了!”时,工作进程需要停止
  • 工作进程需要能够在完成后获取新的起始值
有几种方法可以实现这一点。上面的描述假设工人是活跃的,但是制造愚蠢的工人通常更容易,因为他们只会指出他们什么时候做了,并且在被告知的时候开始做事情。在这种情况下,您只需要在主设备和从设备之间进行点对点通信

在任何情况下,工人在工作时都必须定期轮询通信,从性能角度来看,轮询间隔很重要。如果你经常投票,你就失去了投票的时间。如果你的投票间隔很长,那么当事情发生时你就会失去时间。这种情况更容易与主人,可以使用阻止沟通,只是坐着等待,直到工人说些什么

因此,您可以在工作人员之间使用广播,也可以使用主从通信,也可以使用这些通信的组合。每种方法都有优缺点,最佳解决方案取决于您的应用程序和需求。(我通常选择最简单的解决方案,只有在明确需要时才编写和优化。)


我只对MPI略知一二,但您的问题的答案是“是的”,可以用MPI完成。

:谢谢您的详细回答。我想我必须更加熟悉MPI和各种可能的通信。并行进程必须在上述for循环的每次迭代中开始返回值并停止。主从方法比定期轮询更有意义。如果我的代码有效,我将为这个问题添加一个答案。再次感谢!:-)