2016-12-03 75 views
-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

+0

你在什么处理器/内存上运行?它的读法就像你的意思是“完成,时间= 6秒”,但我的观察结果是每个“迭代时间:6秒”。你期望哪一次下降? – Zulan

回答

0

更换矩阵对角化我解决了这个问题:线性代数用MKL,与使用所有可用线程的一个默认设置进程,此时没有其他进程的其他资源,并行代码基本上是与每个进程轮流使用整个cpu串行执行的。

为了解决这个问题,我可以再补充,每个角化限制在一个线程中的命令

import mkl 
mkl.set_num_threads(1) 

,现在并行的预期速度的东西了。