mpi4py - 使用矩陣列的類型

盧克

使用 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 中工作?另請注意,我更希望解決方案仍然使用第一行 ( column = MPI.INT.Create_vector(4, 1, 4)) 中聲明的向量 MPI 類型

盧克

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

經過試驗,我發現Send當它以matrix[0,1]. 我們必須明確告訴它從矩陣(matrix.data部分)持有的內存中讀取,並在該內存中提供一個偏移量。由於 numpy 默認按 C 順序存儲數據,我們必須向前移動 4 個字節。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章