python - MPI4PY:散布矩阵
问题描述
我正在使用 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]]
解决方案
我认为这段代码可以满足您的需求。这里的问题是 Scatterv 根本不关心 numpy 数组的形状,它只考虑包含您的值的线性内存块。因此,最简单的方法是事先将数据处理成正确的顺序。请注意,这send_data
是一个一维数组,但这并不重要,因为 Scatterv 不在乎。在另一端,recvbuf 的形状已经定义,Scatterv 只是从接收到的一维输入中填充它。
# 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)
推荐阅读
- python - 用户在 Django 中的表单中上传后,图像未加载到 HTML 中
- python - RuntimeWarning:在 double_scalars 和 TypeError 中遇到无效值:“NoneType”对象不可调用
- next.js - 在最新版本的 next.js 中使用 apollo 服务器
- c - STM32F103芯片大约每500ms保持一次复位
- python - 如何使用 python/bash 脚本在 Centos7 中列出所有早于“X”小时的文件?
- unix - Unix命令通过按文件类型和名称分组和排序列出所有文件
- mongodb - 如何对 MongoDB 聚合进行分组
- angular - 使用 Jasmine 和 await 测试基于 HTTP 的异步函数:预期有一个对条件“...”的匹配请求,但没有找到
- algorithm - 为什么 Dijkstras 算法的时间复杂度为 O(V^2)
- c++ - 如何在函数中增加 x 的值?