首页 > 解决方案 > [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正确地做点积是不可能的,我想我的问题是我的算法。我在这里想念什么?

标签: pythonnumpyparallel-processingcluster-computingmpi4py

解决方案


您收到此错误是因为矩阵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)

推荐阅读