Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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收集长度不等的数组 期望的行为:_Python_Mpi_Mpi4py - Fatal编程技术网

Python 如何使用mpi4py收集长度不等的数组 期望的行为:

Python 如何使用mpi4py收集长度不等的数组 期望的行为:,python,mpi,mpi4py,Python,Mpi,Mpi4py,我试图在不同的节点上获取一些不同长度的列表,将它们收集到一个节点中,然后让主节点将它们放在一个集中。此列表在每个节点中命名为rout\u array。请注意,rout_array中的元素仅为整数,在节点间不唯一 错误: 回溯(最近一次呼叫最后一次): 文件“prout.py”,第160行,在 main() 文件“prout.py”,第153行,主 num=DetermineRoutingNumber(步骤、目标、顶点设置大小) 文件“prout.py”,第129行,在determinateRou

我试图在不同的节点上获取一些不同长度的列表,将它们收集到一个节点中,然后让主节点将它们放在一个集中。此列表在每个节点中命名为
rout\u array
。请注意,
rout_array
中的元素仅为整数,在节点间不唯一

错误:
回溯(最近一次呼叫最后一次):
文件“prout.py”,第160行,在
main()
文件“prout.py”,第153行,主
num=DetermineRoutingNumber(步骤、目标、顶点设置大小)
文件“prout.py”,第129行,在determinateRoutingNumber中
comm.Gather(发送缓冲区,接收缓冲区,根=0)
文件“MPI\Comm.pyx”,第589行,位于mpi4py.MPI.Comm.Gather(c:\projects\mpi4py\src\mpi4py.MPI.c:97806)中
文件“MPI\msgbuffer.pxi”,第525行,在mpi4py.MPI.\u p\u msg\u cco.for\u聚集中(c:\projects\mpi4py\src\mpi4py.MPI.c:34678)
文件“MPI\msgbuffer.pxi”,第446行,mpi4py.MPI.\u p\u msg\u cco.for\u cco\u send(c:\projects\mpi4py\src\mpi4py.MPI.c:33938)
mpi4py.MPI.message_simple(c:\projects\mpi4py\src\mpi4py.MPI.c:30349)中的第148行文件“MPI\msgbuffer.pxi”
mpi4py.MPI.message_basic(c:\projects\mpi4py\src\mpi4py.MPI.c:29448)中第93行的文件“MPI\msgbuffer.pxi”
KeyError:'O'
当我的代码中没有字符串时,我不知道如何得到
'O'
的键错误。所有列表都包含整数,numpy数组包含整数,并且这里唯一活动的字典只有键的整数。应该注意的是,每个节点都输出此错误

代码:
导入numpy,数学
从mpi4py导入MPI
从辛组合学中引入置换作为置换
def GetEdge(大小、文件):
“”“此函数接收图形中的边文件,格式为'u,v'
不带引号,其中u和v是图的顶点
生成交换这些顶点的置换,并返回这些顶点
换位
边文件=打开(文件“r”)
边=[]
对于线入边文件:
line=line.strip()
行=行。拆分(“,”)
对于直线中的顶点:
直线[直线索引(顶点)]=int(顶点)
追加(Perm([line],size=size))
edgeFile.close()
追加(Perm([[size-1]],size=size))
返回边
def不相交(p1,p2):
“”“此函数确定两个排列是否移动任何位置。”
公共元素,并返回相应的布尔值。”“”
v1=设置(p1.support())
v2=设置(p2.support())
返回长度(v1和v2)=0
def GetMatching(边、最大匹配、大小):
“”“此函数接受GetEdge()给定的一组边,并且
在给定的图形中生成所有可能的匹配。然后转换
每一个匹配项都按字典顺序排列,并附加
将该秩设置为一个集合,然后返回
stepDict={1:集(边)}
步骤=设置(边)
对于范围内的i(1,最大匹配):
temp=set()
对于步骤[1]中的p1:
对于步骤[i]中的p2:
newPerm=p1*p2
如果不相交(p1、p2)且新PERM不同步:
临时添加(newPerm)
步骤。添加(newPerm)
stepDict[i+1]=温度
newSteps=set()
对于步骤中的步骤:
newSteps.add(step.rank())
返回新闻步骤
def FromRank(等级,级别):
“”“此函数接受排列的秩和大小,然后返回
根据词典编纂法排列在等级上的排列
订购。”“”
lst=列表(范围(级别+1))
perm=[]
而lst:
事实=数学阶乘(len(lst)-1)
索引,秩=divmod(秩,事实)
perm.append(lst.pop(索引))
断言秩==0
回烫
节点之间的def SplitArrayBy(秩、rem、长度):
“”“此函数接受节点的秩和其后的任何余数
在所有节点之间划分数组,然后返回一个起始值
和每个节点唯一的结束分区索引。”“”
如果rem!=0:
如果在列表中排名(范围(rem)):
如果秩==0:
零件开始=0
零件端=长度
其他:
零件开始=等级*(长度+1)
零件结束=零件开始+长度
其他:
零件开始=等级*长度+rem
部分结束=部分开始+长度-1
其他:
零件开始=等级*长度
部分结束=部分开始+长度-1
返回部分开始,部分结束
def definiteRoutingNumber(步骤、目标、顶点设置大小):
“”“此函数接受由GetMatchings()创建的匹配,
并计算其自身元素之间所有可能的乘积
获取所有唯一的产品,并计算所有可能的产品
匹配集和上一个输出。此操作将重复,直到所有
找到给定类型的置换。发生置换的级别
然后返回“”
comm=MPI.comm_WORLD
秩=通信获取秩()
大小=通信获取大小()
长度=长度(步数)
rem=长度%大小
零件长度=长度//尺寸
part_start,part_end=节点之间的拆分数组(秩、rem、part_len)
permDict={1:steps}
i=1
尽管如此:
路由数组=集合()
工作数组=集合(列表(permDict[i])[部分开始:部分结束+1])
#计算所有可能的产品
对于permDict[1]中的p1:
对于工作数组中的p2:
p2_perm=perm(FromRank(p2,顶点集大小-1))
p1_perm=perm(FromRank(p1,顶点集大小-1))
新建=p2\U perm*p1\U perm
如果新(0)==0或新(0)==1:
order=new.rank()
路由数组。添加(订单)
#所有节点都将其工作发送到主节点
通信屏障()
发送缓冲区=numpy.array(路由数组)
sendcounts=numpy.array(comm.gather(len(rout_数组),root=0))
如果秩==0:
recv_buffer=numpy.empty(sum(sendcounts),dtype=int)
其他:
#!/usr/bin/env python3

import numpy as np
from mpi4py import MPI
import random

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
root = 0

local_array = [rank] * random.randint(2, 5)
print("rank: {}, local_array: {}".format(rank, local_array))

sendbuf = np.array(local_array)

# Collect local array sizes using the high-level mpi4py gather
sendcounts = np.array(comm.gather(len(sendbuf), root))

if rank == root:
    print("sendcounts: {}, total: {}".format(sendcounts, sum(sendcounts)))
    recvbuf = np.empty(sum(sendcounts), dtype=int)
else:
    recvbuf = None

comm.Gatherv(sendbuf=sendbuf, recvbuf=(recvbuf, sendcounts), root=root)
if rank == root:
    print("Gathered array: {}".format(recvbuf))
send_buffer = numpy.array(list(rout_array))