【问题标题】:MPI4PY: Scatter a matrixMPI4PY:散布矩阵
【发布时间】:2021-03-12 21:46:31
【问题描述】:

我正在使用 MPI4PY 将 n/p 列分散到两个输入数据进程。但是,我无法按照我的意愿发送列。为了得到最终评论中报告的结果,我必须对代码进行哪些更改?

矩阵是:

[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[13, 14, 15, 16]

那么,n=4 和 p=2。每个进程将分别有 2 列。

这是我的代码:

# Imports
from mpi4py import MPI
import numpy as np

comm = MPI.COMM_WORLD
size = comm.Get_size() 
rank = comm.Get_rank()

rows = 4
num_columns = rows/size

data=None

if rank == 0:
  data = np.matrix([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])

recvbuf = np.empty((rows, int(num_columns)), dtype='int')
comm.Scatterv(data, recvbuf, root=0)
print('Rank: ',rank, ', recvbuf received:\n ',recvbuf)

我得到以下输出:

Rank:  0 , recvbuf received:
[[1 2]
[3 4]
[5 6]
[7 8]]
Rank:  1 , recvbuf received:
[[ 9 10]
[11 12]
[13 14]
[15 16]]

我想得到以下输出:

Rank:  0 , recvbuf received:
[[1 2]
[5 6]
[9 10]
[13 14]]
Rank:  1 , recvbuf received:
[[ 3 4]
[7 8]
[11 12]
[15 16]]

【问题讨论】:

  • numpy 数组存储在行中。一种选择是转置矩阵或将其存储主要列。另一种选择是使用 MPI 派生的数据类型来描述列。
  • 你能给我一个示例代码吗,我会感兴趣的
  • 这是一个(非常)常见的问题,你会在这个网站上找到几个很好的答案。

标签: python matrix parallel-processing mpi mpi4py


【解决方案1】:

我认为这段代码可以满足您的需求。这里的问题是 Scatterv 根本不关心 numpy 数组的形状,它只考虑包含您的值的线性内存块。因此,最简单的方法是事先将数据处理成正确的顺序。请注意,send_data 是一维数组,但这并不重要,因为 Scatterv 不在乎。在另一端,recvbuf 的形状已经定义,Scatterv 只是从接收到的 1D 输入中填充它。

# Imports
from mpi4py import MPI
import numpy as np

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

rows = 4
num_cols = rows/size

send_data=None

if rank == 0:
  data = np.matrix([[1, 2, 3, 4],
                    [5, 6, 7, 8],
                    [9, 10, 11, 12],
                    [13, 14, 15, 16]])

  # Split into sub-arrays along required axis
  arrs = np.split(data, size, axis=1)

  # Flatten the sub-arrays
  raveled = [np.ravel(arr) for arr in arrs]

  # Join them back up into a 1D array
  send_data = np.concatenate(raveled)


recvbuf = np.empty((rows, int(num_cols)), dtype='int')
comm.Scatterv(send_data, recvbuf, root=0)

print('Rank: ',rank, ', recvbuf received:\n ',recvbuf)

【讨论】:

  • 非常感谢,你的回答很完美!
猜你喜欢
  • 1970-01-01
  • 2020-03-11
  • 2022-01-03
  • 2015-09-17
  • 2016-08-26
  • 2011-06-09
  • 2014-11-09
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多