Parallel processing 使用mpi4py实现包含随机采样的循环的并行化
我不熟悉并行化和MPI。我正在学习和试验mpi4py。目前,我正在尝试优化一种方法的性能,该方法在一个时间间隔内随机采样一个期望点(满足一个条件) 为了给你一个详细的想法,我创建了一个与我的程序类似的示例程序。该程序的目标是输出9.9999和10.0之间的20个数字。这是通过从[0.0,1.0]中随机取样并将其乘以10来实现的(通过迭代以无穷小的数量变化) 以下是提供的功能和注释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)
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循环的每次迭代中开始返回值并停止。主从方法比定期轮询更有意义。如果我的代码有效,我将为这个问题添加一个答案。再次感谢!:-)