在上一篇中我们介绍了 mpi4py 中的客户端-服务器编程方法,下面我们将介绍 mpi4py 中的 memory 对象及内存操作。
Python 是一种比较高级的动态编程语言,通过其提供的高级对象和语法,我们一般不需要直接同底层的内存操作打交道,比如说,在 Python 中,我们一般不会如在 C/C++ 等语言中一样先分配内存区域,然后使用分配的内存,使用完后再释放内存,Python 会为我们自动进行内存管理,并在合适的时候自动进行垃圾回收,以释放一些不再使用的对象所占用的内存空间。
MPI 标准一般是用像 C 这样较低级的语言实现的,在 MPI 的很多操作中都涉及对内存的直接使用,如消息传递的内存缓冲区,单边通信中的动态窗口创建及内存加载/卸载等,因此 MPI 中提供了若干对内存的操作和管理函数。
mpi4py 对 MPI 标准实现进行了封装,提供了比较高级的 Python 使用接口,使我们能够非常方便地在 Python 语言中以 Python 的高级语法形式使用 MPI。使用 mpi4py,对内存的直接底层操作是应该尽量避免的,因为这并不符合 Python 的编程哲学和编程方式。因此,mpi4py 提供了 MPI.memory 对象,封装和隐藏了对内存的底层操作,为我们提供了比较高级的符合 Python 编程方式的方法接口。如果涉及到内存操作,我们应该尽量使用 MPI.memory 对象。当然,mpi4py 也提供了若干内存操作函数,这些是对 MPI 标准中对应函数的直接封装和调用。
MPI.memory 对象
方法
MPI.memory.frombuffer(obj, bint readonly=False)
MPI.memory 类的静态方法,由参数 obj
的缓冲区创建并返回一个 MPI.memory 对象,readonly
指定创建的 MPI.memory 对象是否是只读的。obj
必须是实现了缓冲区协议(buffer protocal)的对象。
MPI.memory.fromaddress(address, nbytes, bint readonly=False)
MPI.memory 类的静态方法,由内存地址 address
开始的连续 nbytes
字节的一块内存区创建并返回一个 MPI.memory 对象,readonly
指定创建的 MPI.memory 对象是否是只读的。
MPI.memory.tobytes(self)
将该 MPI.memory 对象所包含的内存区的数据作为一个 byte string 返回。
MPI.memory.release(self)
释放该 MPI.memory 对象所包含的内存区。
MPI.memory.__len__(self)
返回该 MPI.memory 对象所包含的内存区的大小(以字节为单