Python mpi4py Sendrecv的使用

Python mpi4py Sendrecv的使用,python,communication,mpi4py,Python,Communication,Mpi4py,我正在努力学习mpi4py。下面的测试代码对我来说非常简单 #shift.py from mpi4py import MPI comm=MPI.COMM_WORLD rank = comm.Get_rank() size = comm.Get_size() nxt = (rank+1)%size prev = (rank-1)%size num = rank num2 = 0 print rank, num num2 = comm.Sendrecv(num,dest=nxt,sour

我正在努力学习mpi4py。下面的测试代码对我来说非常简单

#shift.py

from mpi4py import MPI

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

nxt = (rank+1)%size
prev = (rank-1)%size

num = rank
num2 = 0

print rank, num

num2 = comm.Sendrecv(num,dest=nxt,source=prev)

print rank, num2
但是运行这个东西

mpirun -np 4 python shift.py
。。。从所有进程引发此错误:

TypeError: message: expecting buffer or list/tuple

我还没有找到任何关于Sendrecv的相当完整的文档。知道我做错了什么吗?

如果有人感兴趣的话,结果发现Sendrecv(我使用的)和Sendrecv(注意小写)是两个不同的例程。Sendrecv使用缓冲区。sendrecv更通用,可以很好地配合我正在尝试的工作。我唯一能找到讨论这个问题的地方是。

我猜您正在传递的某些消息-num看起来应该是一个缓冲区或列表数据类型。尝试在Sendrecv调用中执行[num]或将num强制转换到缓冲区。对于缓冲区转换,请参阅@TheLoverter4865早些时候尝试过,我想我会再试一次。重新定义num2=[]。在Sendrecv参数中,[num]给出了错误值error:message:应为2到4项,而list(num)给出了错误类型error:“int”对象不可iterable。不过谢谢你。任何其他想法都是最受欢迎的。是的,我会选择将数据转换为缓冲区-看看你是否可以在其中插入字符串或其他东西,看看它是否会自动将字符串转换为缓冲区。@TheLoverter4865 FWIW,我可以传递numpy数组,没问题。@TheLoverter4865如果你感兴趣,Sendrecv(我使用)和Sendrecv(注意小写)有两种不同的程序。Sendrecv使用缓冲区。sendrecv更通用,可以很好地配合我正在尝试的工作。你会这么想吗?我永远不会!嘘!另一个讨论的地方是在教程中::“通用Python对象的通信您必须使用所有小写方法”和“缓冲区提供程序对象的通信:您必须使用以大写字母开头的方法名”@Rob Latham嗯,我看了那一页,但我错过了它。谢谢这种正交性(大写表示缓冲区,小写表示pythony对象)适用于很多mpi4py。。。但不适用于文件i/o。对于文件i/o,必须使用numpy数组和大写版本——不完全清楚“将元组写入磁盘”是什么意思,也没有小写版本。