2016-12-03 2 views
-1

6 코어 인텔 제온 기계에서 numpy.linalg 및 openmpi/mpi4py를 사용하여 완전히 독립적 인 많은 행렬 계산을 대각 화하려고합니다.mpi4py는 현저하게 병렬화 가능한 코드의 속도를 향상시키지 못합니다.

N 개의 프로세스로 실행하면 각 행렬 계산이 N 배로 길어서 계산을위한 총 시간이 비 병렬 버전과 같고 (실제로 약간 느립니다).

예. 여기에 단지 12 임의 1000x1000 행렬을 대각선 화 간단한 코드는 다음과 같습니다

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 초, 4 개 프로세스와 9 초 약 6 초 걸립니다. 아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있니? MPI 통신이없는이 당황스럽게 병렬화 가능한 코드가 속도 향상을 병렬로 실행하지 않는 이유는 무엇입니까?

나도 같은 코드를 실행하지만 문제 해결이 아닌 scypi.linalg

+0

이것을 실행하는 프로세서/메모리는 무엇입니까? 그것은'done, time = 6 seconds'을 의미하는 것처럼 읽지 만, 제 관찰은 각 반복 시간 인 6 초입니다. 어느 시간대에 내려갈 것으로 예상됩니까? – Zulan

답변

0

와 행렬 대각를 교체 할 경우 하나의 가능한 모든 스레드를 사용하는 기본 설정으로, 선형 대수가 MKL을 사용 하였다 프로세스는 다른 프로세스를위한 다른 리소스가 없었고, 병렬 코드는 기본적으로 전체 프로세스를 차례대로 사용하여 차례대로 실행되었습니다.

난 그냥 하나 개의 스레드에 각 대각을 제한 명령
import mkl 
mkl.set_num_threads(1) 

을 추가 할 수 있습니다,이 문제를 해결하려면, 예상대로 지금 병렬화는 것을 속도가 빨라집니다.