arrays - Mpi4Py - 发送无副本的 numpy 子数组(非连续内存)

我正在重写通信瓶颈。我需要发送 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)

在实际代码中,我使用异步发送/接收。目前我通过将子数组复制到具有连续内存布局的临时数组来解决它。

问题是缓冲区往往非常大,它会占用所有内存和可用交换空间。

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

也不能使用小写版本的 send/recv,因为正如我所说,我需要速度并且数据很大。

目前我唯一的想法是创建 C 模块扩展,我在其中进行所有指针计算并返回 numpy 数组,并可以访问包含我的子数组的连续内存段。

最佳答案

当我遇到同样的问题时,发现这个问题没有答案。您可以使用 Create_subarray(sizes, subsizes, starts, 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)

https://stackoverflow.com/questions/34317197/

相关文章:

python - 独立于数据集单位的 Matplotlib 轴限制和文本位置

asp.net - 在 asp.net 发布期间不要删除特定文件?

android - Logcat 警告 :Drawable android:drawable/tex

maven - 如果 Maven 中不存在,如何创建文件夹?

php - Yii session 存储、生命周期和 cookie

java - 我正在尝试使用 tomcat 实现有弹性的 caSTLe,但出现 ClassNotFo

text - 文本分类的 TensorFlow 示例 - 如何评估您自己的文本?

php - 数据表在服务器端laravel中获取的最大记录数

java - 改造同步调用异步调用

lua - nodemcu如何减少获取ip地址所需的时间