繁体   English   中英

mpi4py - 使用矩阵列的类型

[英]mpi4py - using a type for matrix column

使用 mpi4py,我创建了一个代码,它定义了一个新的数据类型来保存矩阵的列并将其发送到其他 MPI 进程:

column = MPI.INT.Create_vector(4, 1, 4)
column.Commit()
if rank == 0:
        matrix = np.array([[1, 2, 3, 4],
                           [5, 6, 7, 8],
                           [9, 10, 11, 12],
                           [13, 14, 15, 16]], dtype=np.intc)
        comm.Send([matrix, 1, column], 1)
else:
        matrix = np.array([[-1, -1, -1, -1],
                           [-2, -2, -2, -2],
                           [-3, -3, -3, -3],
                           [-4, -4, -4, -4]], dtype=np.intc)
        comm.Recv([matrix, 1, column], source=0)
        print(matrix)

只要只关注矩阵的第一列,这就是有效的。 程序打印:

[[ 1 -1 -1 -1]
 [ 5 -2 -2 -2]
 [ 9 -3 -3 -3]
 [13 -4 -4 -4]]

我如何 go 关于将第二列矩阵从进程 0 发送到进程 1? 当我尝试使用comm.Send([matrix[0,1], 1, column], 1)发送它时,接收进程会将值[2, -136678432, 0, 0]插入其矩阵中。 因此,我相信我以错误的方式访问了 ndarray 的 memory。

如果我将此代码转换为 C 并使用MPI_Send (&matrix[0][1], 1, column, 1, 123, MPI_COMM_WORLD)一切正常,第二列转移到进程 1。如何使代码在 Python 中工作/mpi4py? 另请注意,我希望该解决方案仍使用第一行中声明的向量 MPI 类型( column = MPI.INT.Create_vector(4, 1, 4) )。

Numpy 基于 Blas 库,该库最初是用 Fortran 编写的,因此使用列存储。 这意味着您的列类型实际上提取了一行。 让您感到困惑的是,在您的输入中,您的矩阵看起来是一种方式,但如果您打印它,您会发现您的“行”实际上是列。 您认为将构成一行的任何四个连续元素实际上是一列。

现在,如果您运行这些数字,您会看到您的第二行实际上提取了数组之外的非法位置。

我的解决方案是更改示例代码中的Send部分,如下所示: comm.Send([np.frombuffer(matrix.data, np.intc, offset=4), 1, column], 1)

经过实验,我发现Send在以matrix[0,1]形式给出时从 memory 缓冲区读取时存在问题。 我们必须明确告诉它从矩阵( matrix.data部分)保存的 memory 中读取,并在 memory 中给出偏移量。 由于 numpy 默认以 C 的顺序存储数据,我们必须向前移动 4 个字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM