【发布时间】:2017-04-18 12:28:16
【问题描述】:
我正在尝试在 6 核英特尔至强机器上使用 numpy.linalg 和 openmpi/mpi4py 对大量完全独立的矩阵计算进行对角化。
当使用 N 个进程运行时,每个矩阵计算似乎需要 N 倍的时间,因此计算的总时间与非并行版本相同(实际上慢一点)。
例如这是一个简单的代码,它只是将 12 个随机 1000x1000 矩阵对角化:
import numpy as np
import numpy.linalg as la
import os
import random
import time
# MPI imports ----
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
N_nodes = comm.Get_size()
t0 = time.time()
def dosomework(N):
matrix = np.random.rand(N,N)
matrix = matrix+matrix.T
la.eig(matrix)
return 1
N_tot = 12
N_per_process = np.int(np.ceil(N_tot/N_nodes))
worker_data = []
for j in range(N_per_process):
dosomework(1000)
print 'Node:',rank,'; iteration:',j,'; time:',time.time()-t0
if rank==0:
print 'done, time = ',time.time()-t0
1 个进程大约需要 6 秒,2 个进程大约需要 6 秒,4 个进程大约需要 9 秒。谁能告诉我发生了什么?为什么这个没有 MPI 通信的可并行化代码没有从并行运行中获得加速?
如果我运行相同的代码,但用非 scypi.linalg 替换矩阵对角化
【问题讨论】:
-
你在什么处理器/内存上运行它?读起来好像你的意思是
done, time = 6 seconds,但我的观察是每个iteration time: 6 seconds。你预计什么时候下降?