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]]

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

如果我将这段代码翻译成 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))。

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

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