【发布时间】:2016-03-22 21:28:33
【问题描述】:
我正在重写通信瓶颈。我需要发送 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)
在实际代码中,我使用异步发送/接收。目前我通过将子数组复制到具有连续内存布局的临时数组来解决它。
问题是缓冲区往往非常大,它会占用所有内存和可用交换空间。
我认为创建跨步数据类型是一种可行的方法,但由于我无法访问具有连续内存的原始数组,因此我无法创建跨步缓冲区。
也不能选择使用小写版本的发送/接收,因为正如我所说,我需要速度并且数据量很大。
目前我唯一的想法是创建 C 模块扩展,在其中我进行所有指针计算并返回 numpy 数组并访问包含我的子数组的连续内存段。
【问题讨论】: