Arrays Mpi4Py-发送numpy子阵列(非连续内存)而不复制

Arrays Mpi4Py-发送numpy子阵列(非连续内存)而不复制,arrays,numpy,mpi,mpi4py,Arrays,Numpy,Mpi,Mpi4py,我正在重写通信瓶颈。我需要发送3dnumpy数组的子数组。 但是将子数组直接传递到MPI.Send()失败,原因是: ValueError: ndarray is not contiguous 通过MPI.datatype.Create_vector创建新的数据类型没有帮助-由于同样的原因失败 简化示例: a = numpy.zeros([9,9]) sub = a[3:5, 3:5] comm = MPI.COMM_WORLD rank = comm.Get_rank() t = MPI

我正在重写通信瓶颈。我需要发送3d
numpy
数组的子数组。 但是将子数组直接传递到MPI.Send()失败,原因是:

ValueError: ndarray is not contiguous
通过
MPI.datatype.Create_vector
创建新的数据类型没有帮助-由于同样的原因失败

简化示例:

a = numpy.zeros([9,9])
sub = a[3:5, 3:5]

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

t = MPI.DOUBLE.Create_vector(2, 2, 9)
t.Commit()

if rank == 0:
    sub.flat[:] = range(1,9)
    comm.Send([sub, t], dest=1)
else:
    comm.Recv([sub, t], source=0)
在实际代码中,我使用异步发送/接收。目前,我通过将子数组复制到具有连续内存布局的临时数组来解决这个问题

问题是缓冲区往往相当大,它会占用所有的内存和可用的交换空间

我认为创建跨步数据类型是一种可行的方法,但由于我无法使用连续内存访问原始数组,因此无法创建跨步缓冲区

另外,使用send/recv的小写版本也不是一个选项,因为正如我所说的,我需要速度和数据量


目前我唯一的想法是创建C模块扩展,在这里我完成所有指针计算并返回numpy数组,并访问包含子数组的连续内存段

当我面对同样的问题时,我发现这个问题没有答案。您可以使用
Create_子阵列(大小、子阵列、开始、int order=order_C)
来完成此操作:

import numpy as np
from mpi4py import MPI

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

a = np.zeros([9, 9])

if rank == 0:
    a[3:5, 3:5] = np.ones([2, 2])

t = MPI.DOUBLE.Create_subarray([9, 9], [2, 2], [3, 3])
t.Commit()

if rank == 0:
    comm.Send([a, t], dest=1)
else:
    comm.Recv([a, t], source=0)
额外提示:据我所见,mpi4py的文档非常少。在使用
mpi4py
联机创建派生数据类型方面,我找不到任何帮助。如果要查看可以使用
mpi4py
创建的数据类型列表,请在Python控制台上运行以下命令:

>>> from mpi4py import MPI
>>> help(MPI.DOUBLE)