1

我是并行化和 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 循环到来时,这些进程被并行触发,无论哪一个首先找到所需的值,我想将该值添加到累加器数组并中止所有其他进程。我想在下一次迭代中再次继续这个例程,依此类推,直到方法完成。这样的事情可能吗?如果不是这种方式,我可以在上述函数中使用并行化的其他方式吗?

谢谢

4

1 回答 1

1

并行化背后的一般思想严重依赖于应用程序。您可以使您的流程越独立越好。进程间通信增加了麻烦和开销。如果您的进程驻留在不同的计算机中,则尤其如此。

使用上面的示例代码,使其并行的简单方法是通过迭代将其拆分。您将有一个迭代列表和许多工作进程,这些进程一次将通过一个迭代周期。即使您需要按顺序排列结果,也可以事后对它们进行排序。因此,如果您经历 0、1、2、3... 或例如 17、3、14、1、5... 的迭代,这并不重要

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

  • 工作进程需要能够发送“我找到了!”
  • 当另一个进程发送“我找到了!”时,工作进程需要停止。
  • 工作进程需要能够在完成后获取新的起始值

有几种方法可以做到这一点。上面的描述假设工人是活跃的,但通常更容易制造愚蠢的工人,它们只指示他们何时完成并在他们被告知时开始做事。在这种情况下,您只需要主从之间的点对点通信。

在任何情况下,工作人员在工作时都必须定期轮询通信,从性能的角度来看,轮询间隔很重要。如果您非常频繁地进行轮询,则会浪费时间进行轮询。如果您的轮询间隔很长,那么您在发生某些事情时会浪费时间。主人的情况更容易,它可以使用阻塞通信,只是坐等工人说些什么。

因此,您可以使用工作人员之间的广播,或者您可以使用主从通信,或者您可以使用这些的组合。每种方法各有利弊,最佳解决方案取决于您的应用和要求。(我通常只在有明确需要时才选择最容易编写和优化的解决方案。)

我对 MPI 只是表面上熟悉,但你的问题的答案是“是的”,它可以用 MPI 来完成。

于 2014-08-21T08:33:54.797 回答