python - [Python]:mpi4py 并行 numpy 点积
问题描述
所以我试图在集群上使用 mpi4py 并行 numpy 的点积。基本思想是将第一个矩阵拆分为较小的矩阵,将较小的矩阵与第二个矩阵相乘,然后将结果堆叠为一个。
我面临一些问题,尽管并行乘法的结果与在一个线程上运行的结果不同,除了第一行。
from mpi4py import MPI
import numpy as np
comm = MPI.COMM_WORLD
world = comm.size
rank = comm.Get_rank()
name = MPI.Get_processor_name()
a = np.random.randint(10, size=(10, 10))
b = np.random.randint(10, size=(10, 10))
c = np.dot(a, b)
# Parallel Multiplication
if world == 1:
result = np.dot(a, b)
else:
if rank == 0:
a_row = a.shape[0]
if a_row >= world:
split = np.array_split(a, world, axis=0)
else:
split = None
split = comm.scatter(split, root=0)
split = np.dot(split, b)
data = comm.gather(split, root=0)
if rank == 0:
result = np.vstack(data)
# Compare matrices
if rank == 0:
print("{} - {}".format(result.shape, c.shape))
if np.array_equal(result, c):
print("Multiplication was successful")
else:
print("Multiplication was unsuccessful")
print(result - c)
我试图在没有点积的情况下执行 split、scatter、gather、vstack 命令。收集的堆叠矩阵是矩阵 A。这可能意味着收集的索引不会在进程之间打乱。由于我认为np.dot
正确地做点积是不可能的,我想我的问题是我的算法。我在这里想念什么?
解决方案
您收到此错误是因为矩阵b
是由两个处理器随机生成的,因此两者都不相同。考虑b
在 rank 0 的进程中生成,然后将其发送到其他处理器。换行:
b = np.random.randint(10, size=(10, 10))
经过
if rank == 0:
b = np.random.randint(10, size=(10, 10))
else:
b = None
b = comm.bcast(b, root=0)
推荐阅读
- python - 如何添加两个输入并将它们连续保存为列表列表?
- swift - 在 swift 中使用 Alamofire 取消任何 api 请求
- java - 如何找到可整除的数?
- cron - 运行 crontab 作业时的非法访问
- git - 如何确保开发人员在存储库迁移后使用新的 git remote
- salesforce - 无法从 VALUE_STRING 值 1,9459.1650 反序列化货币实例,或者请求可能缺少必填字段
- ruby-on-rails - 在 Rails 中使用 rswag - 索引响应(数组)的语法是什么?
- java - Maven 命令行按名称从远程存储库列表中排除下载
- java - Hibernate 在数据库中插入额外的记录
- python - 分类到序数转换,我应该使用什么值?