所以我正在尝试在集群上使用mpi4py并行numpy的点积。
基本思路是将第一个矩阵分割成较小的矩阵,将这些小矩阵与第二个矩阵相乘,然后将结果堆叠在一起。
我遇到了一些问题,虽然并行乘法的结果与单线程运行的结果不同,除了第一行。
我尝试执行拆分、散开、收集和垂直堆叠命令,但没有进行点积。收集堆叠的矩阵是矩阵A。这可能意味着收集的索引在进程之间没有被混洗。因为我认为使用np.dot正确执行点积是不可能失败的,所以我猜想我的问题在于算法。我在这里漏掉了什么?
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)
我尝试执行拆分、散开、收集和垂直堆叠命令,但没有进行点积。收集堆叠的矩阵是矩阵A。这可能意味着收集的索引在进程之间没有被混洗。因为我认为使用np.dot正确执行点积是不可能失败的,所以我猜想我的问题在于算法。我在这里漏掉了什么?
b
在每个进程上都不同,因为它在每个进程上都是随机生成的。 - bousof