Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用mpi4py在n个进程(x>;>;n)之间拆分x个任务_Python_Split_Mpi4py - Fatal编程技术网

Python 使用mpi4py在n个进程(x>;>;n)之间拆分x个任务

Python 使用mpi4py在n个进程(x>;>;n)之间拆分x个任务,python,split,mpi4py,Python,Split,Mpi4py,我想通过mpi4py在一些处理器之间分割大量的单个任务。 下面的例子可以说明我的意图: from mpi4py import MPI import numpy from numpy import random comm=MPI.COMM_WORLD rank=comm.Get_rank() size=comm.Get_size() def doSomething(x): return numpy.sum(x) if rank==0: v=random.ran

我想通过mpi4py在一些处理器之间分割大量的单个任务。 下面的例子可以说明我的意图:

from mpi4py import MPI
import numpy
from numpy import random

comm=MPI.COMM_WORLD
rank=comm.Get_rank()
size=comm.Get_size()

def doSomething(x):
        return numpy.sum(x)

if rank==0:
        v=random.random((3,3))
        print 'thats v_random:\n', v

        for i in range(len(v)):
                comm.send(v[i],dest=i)

data=comm.recv(source=0)
print 'my rank is {0} and my output is {1}\n'.format(rank,doSomething(data)) 
就我用len(v)=进程数执行它而言,一切都很好。 但当v=random时,random((100,3))显然不起作用。这通常是如何实现的


提前感谢。

我在读博士期间使用Fortran编写了一些MPI代码来模拟粒子轨迹,我们只是做了一点欺骗,总是让模拟中的粒子数为二的幂,这样它们就可以在处理器之间均匀分布。

好的,我找到了一些解决方法。我很确定这不是最优雅的方式,但我不知道如何用另一种方式来完成它。因此,如果有人遇到同样的问题,这里有一个丑陋但有效的解决方案:

from mpi4py import MPI
import numpy
from numpy import random

comm=MPI.COMM_WORLD
rank=comm.Get_rank()
size=comm.Get_size()

if(rank==0):
    v=random.random((7,3))
    if size>=len(v):
        size=len(v)
    slice_size=int(numpy.ceil(float(len(v))/float(size)))
    slice_for_last_node=len(v)-(size-1)*slice_size      
    #xtra_slices=len(v)%size

    rows=len(v)
    print "slice_size:",slice_size
    print "slice_for_last_node:",slice_for_last_node
else:
    slice_size=slice_for_last_node=rows=None

size=comm.bcast(size,root=0)
slice_size=comm.bcast(slice_size,root=0)
slice_for_last_node=comm.bcast(slice_for_last_node,root=0)
rows=comm.bcast(rows,root=0)

def doSomething(x):
        return numpy.sum(x)

if rank==0:

        print 'thats v_random:\n', v

    count=1
    cur_dest=0

        for i in range(len(v)): 
        if(count>slice_size and cur_dest<size-1):
            cur_dest+=1
            count=1
        if(cur_dest>=size-1):
            cur_dest=size-1

            comm.send(v[i],dest=cur_dest)
        count+=1

if rank<size-1:
    count=1
    while count<=slice_size: #slices per proc
        data=comm.recv(source=0)
        count+=1
        print 'my rank is {0} and my output is {1}\n'.format(rank,doSomething(data))


elif rank==size-1:
    count=1
        while count<=slice_for_last_node:
            data=comm.recv(source=0)
                count+=1
                print 'my rank is {0} and my output is {1}\n'.format(rank,doSomething(data))
从MPI4p导入MPI
进口numpy
从numpy导入随机
comm=MPI.comm_WORLD
秩=通信获取秩()
大小=通信获取大小()
如果(秩==0):
v=随机。随机((7,3))
如果尺寸>=透镜(v):
尺寸=长度(v)
slice_size=int(numpy.ceil(float(len(v))/float(size)))
最后一个节点的切片=len(v)-(大小-1)*切片大小
#xtra_切片=透镜(v)%size
行=长(v)
打印“切片大小:”,切片大小
打印“最后一个节点的切片:”,最后一个节点的切片
其他:
slice\u size=slice\u for\u last\u node=rows=None
大小=comm.bcast(大小,根=0)
slice\u size=comm.bcast(slice\u size,root=0)
最后一个节点的切片=comm.bcast(最后一个节点的切片,根=0)
行=comm.bcast(行,根=0)
def剂量计(x):
返回numpy.sum(x)
如果秩==0:
打印“这是随机的:\n”,v
计数=1
cur_dest=0
对于范围内的i(len(v)):
如果(计数>切片大小,当前目的地=大小-1):
cur_dest=尺寸-1
通信发送(v[i],目的地=当前目的地)
计数+=1
如果等级