2016-12-03 12 views
-1

6コアのIntel Xeonマシンでnumpy.linalgとopenmpi/mpi4pyを使用して、多数の完全に独立した行列計算を対角化しようとしています。mpi4pyは驚くほど並列化可能なコードを高速化しません

N個のプロセスで実行すると、各行列計算はN回かかるように見えるため、計算の合計時間は非並列バージョンと同じ(実際には少し遅くなります)。

など。

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 

これは、一つのプロセスで6sec、二つのプロセスと6sec、および4つのプロセスと9秒ほどかかります:ここだけの12個のランダムな1000×1000の行列を対角化する簡単なコードです。誰が何が起こっているか教えてくれますか? MPI通信を持たないこの恥ずかしげに並列化可能なコードがスピードアップを並行して実行できないのはなぜですか?

私は同じコードを実行するが、非scypi.linalg

+0

これはどのプロセッサ/メモリで実行しますか?それはあなたが 'done、time = 6 seconds'を意味するように読んでいますが、私の観察はむしろそれぞれの反復時間:6秒です。どの時に下りると思いますか? – Zulan

答えて

0

で行列対角化を交換した場合、私は問題を解決:線形代数は、いずれかの利用可能なすべてのスレッドを使用するには、デフォルトの設定で、MKLを使用していましたプロセスでは、他のプロセスには他のリソースがなく、基本的に並列コードはCPUごとに順番に各プロセスで順番に実行されていました。この問題を解決するには

、私はただ一つのスレッドに各対角を制限し、そして予想通り、今並列化は物事をスピードアップするコマンド

import mkl 
mkl.set_num_threads(1) 

を追加することができます。

関連する問題