-1
我想在6核英特尔至强机上使用numpy.linalg和openmpi/mpi4py对大量完全独立的矩阵计算进行对角化。mpi4py不加速embarrisingly可并行化的代码
当使用N个进程运行时,每个矩阵计算似乎需要延长N倍,因此计算的总时间与非并行版本相同(实际上比较慢)。
E.g.这里有一个简单的代码,仅仅对角化12个1000×1000的随机矩阵:
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
这大约需要6秒的一个过程中,6秒有两个过程,和9秒,4个进程。谁能告诉我发生了什么事?为什么这种没有MPI通信的令人尴尬的可并行代码没有得到并行运行的加速?
如果我运行相同的代码,但与非scypi.linalg
你在什么处理器/内存上运行?它的读法就像你的意思是“完成,时间= 6秒”,但我的观察结果是每个“迭代时间:6秒”。你期望哪一次下降? – Zulan