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