2016-12-03 77 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) 

,現在並行的預期速度的東西了。