【问题标题】:Parallelization of a loop which involves random sampling using mpi4py涉及使用 mpi4py 进行随机采样的循环的并行化
【发布时间】:2014-10-14 07:26:10
【问题描述】:

我是并行化和 MPI 的新手。我正在学习和试验 mpi4py。目前我正在尝试优化一种方法的性能,该方法在一个区间内随机采样所需的点(满足条件)。

为了给你一个详细的想法,我创建了一个与我的程序类似的示例程序。该程序的目的是输出 9.9999 和 10.0 之间的 20 个数字。这是通过从 [0.0,1.0] 中随机采样并将其乘以 10 来完成的(通过迭代变化无穷小)。

以下是提供的函数和cmets。

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

谢谢

【问题讨论】:

    标签: parallel-processing mpi cluster-computing multicore mpi4py


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • :感谢您的详细回答。我想我必须更加熟悉 MPI 和各种可能的通信。并行进程必须在上述 for 循环的每次迭代中开始返回值停止。主从方法比定期轮询更有意义。如果我的代码有效,我将为这个问题添加一个答案。再次感谢! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多