我正在重写通信瓶颈。我需要发送 3d 数组的子numpy
数组。但是将子数组直接传递给MPI.Send()
失败:
ValueError: ndarray is not contiguous
创建新数据类型 byMPI.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)
在实际代码中,我使用异步发送/接收。目前我通过将子数组复制到具有连续内存布局的临时数组来解决它。
问题是缓冲区往往非常大,它会吃掉所有的内存和可用的交换空间。
我认为创建跨步数据类型是一种可行的方法,但是由于我无法访问具有连续内存的原始数组,因此我无法创建跨步缓冲区。
也不能选择使用小写版本的发送/接收,因为正如我所说,我需要速度并且数据很大。
目前我唯一的想法是创建 C 模块扩展,在其中我进行所有指针计算并返回 numpy 数组并访问包含我的子数组的连续内存段。