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 个字节。
我使用 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 个字节。