【问题标题】:MPI4PY - Can I predict padding size?MPI4PY - 我可以预测填充大小吗?
【发布时间】:2020-11-16 21:37:48
【问题描述】:

考虑下面的程序,它提供了一个字节用于填充,这是不够的。

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

我如何知道要向消息中添加多少额外内容,以保证传输成功?

【问题讨论】:

    标签: python mpi pickle mpi4py


    【解决方案1】:

    如果您调用不带参数的小写函数,您将获得大小为 32k 的默认缓冲区。

    w = MPI.COMM_WORLD.irecv()
    

    如果你想指定缓冲区的大小,你需要传入一个缓冲区对象作为具有正确大小的参数。在您的代码中,您只指定一个整数作为缓冲区。

    同样在这种情况下,由于您使用的是小写版本,因此 mpi4py 包会腌制您的数据,从而使其更长。您必须编写如下内容:

    recvbuf = bytearray(b' ' * len(pickle.dumps(f)))
    w = MPI.COMM_WORLD.irecv(buf=recvbuf)
    

    如果您想指定数据的长度,但我建议您查看函数的大写实现并使用 numpy 数组。它显示在文档here中。

    【讨论】:

    • 那个有限制 - 默认为 32k。
    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2013-12-06
    相关资源
    最近更新 更多