python - MPI4PY - 我可以预测填充大小吗?
问题描述
考虑下面的程序,它提供了一个字节用于填充,这是不够的。
import pickle
from mpi4py import MPI
s = ''
f = pickle.dumps(s)
print(len(f))
w = MPI.COMM_WORLD.irecv(len(f)+1)
MPI.COMM_WORLD.send(f, dest=0)
f = w.wait()
print(len(f))
它产生:
Traceback (most recent call last):
File "...", line 10, in <module>
f = w.wait()
File "mpi4py/MPI\Request.pyx", line 235, in mpi4py.MPI.Request.wait
File "mpi4py/MPI\msgpickle.pxi", line 411, in mpi4py.MPI.PyMPI_wait
mpi4py.MPI.Exception: Message truncated, error stack:
MPI_Wait(request=0x000001C6A3EC78D8, status0x00000073023EF3A0) failed
Message truncated; 11 bytes received but buffer size is 11
我如何知道要在消息中添加多少额外内容,以保证传输成功?
解决方案
如果您调用不带参数的小写函数,您将获得大小为 32k 的默认缓冲区。
w = MPI.COMM_WORLD.irecv()
如果要指定缓冲区的大小,则需要传入缓冲区对象作为具有正确大小的参数。在您的代码中,您只指定一个整数作为缓冲区。
同样在这种情况下,由于您使用的是小写版本,因此 mpi4py 包将腌制您的数据,这将使其更长。您必须编写如下内容:
recvbuf = bytearray(b' ' * len(pickle.dumps(f)))
w = MPI.COMM_WORLD.irecv(buf=recvbuf)
但是,如果您想指定数据的长度,我建议您查看函数的大写实现并使用 numpy 数组。它显示在此处的文档中。
推荐阅读
- c# - 如何从 xmlnode C# 获取内部文本
- terminal - wget -v -t=5 --no-clobber -x http://www.website.com/ 当我在终端运行这个命令时,这个网站会发生什么?
- node.js - 无法使用纱线在 Laravel 中安装 UIkit 3
- node.js - 使用正则表达式在 Couchdb 查找请求上出现无效的 UTF-8 JSON 错误
- kotlin - Kotlin:获取另一个范围内的范围值
- airflow - 您如何访问 Airflow Web 界面?
- c# - 为每一行调用存储过程不起作用
- xamarin.forms - 直观地编辑 Xamarin 表单页面
- html - 为什么html的嵌套列表不起作用?
- go - 在go中将接口转换为float32