2017-01-14 4 views
0

나는 두 개의 코드를 동시에 계산하기 위해 spmd을 사용했습니다. 내가 사용하고있는 컴퓨터에는 8 개의 코어가있는 프로세서가 있습니다. 통신 오버 헤드는 0과 같습니다.
spmd 블록의 실행 시간과 spmd 외부의 동일한 코드를 tic & toc으로 비교합니다.
코드를 실행할 때 코드의 병렬 버전이 순차 형식보다 시간이 오래 걸립니다.
그 이유는 무엇입니까? 두 가지 이유가 여기에있다SPMD가 연속 matlab보다 더 큰 이유는 무엇입니까

tic; 
spmd 
    if labindex == 1 
     gamma = (alpha*beta); 
    end 
    if labindex == 2 
     for t = 1:T, 
      for i1=1:n 
       for j1=1:n 
        kesi(i1,j1,t) = (alpha(i1,t) + phi(j1,t)); 
       end; 
      end; 
     end; 
    end 
end 
t_spmd = toc; 


tic; 
    gamma2= (alpha * beta); 
for t = 1:T, 
    for i1=1:n 
     for j1=1:n 
      kesi2(i1,j1,t) = (alpha(i1,t) + phi(j1,t)); 
     end; 
    end; 
end; 
t_seq = toc; 
disp('t spmd : ');disp(t_spmd); 
disp('t seq : ');disp(t_seq); 
+0

이 변수 '사전 할당'에 도움이 될 수 '케시 '? 예 : 'kesi = 0 (크기 (...))'2 호선에서 – Wouter

+0

아니, 전에 해봤는데, 그냥 여기 가져 오지 않았어. –

답변

1

:
여기에 내가 무슨 말의 샘플 코드입니다. 첫째, if labindex == 2을 사용하면 spmd 블록의 주체가 단일 작업자에 의해 실행된다는 것을 의미합니다. 여기에는 병렬 처리가 없습니다.

두 번째로 (기본적으로) 병렬 풀 작업자는 단일 계산 스레드 모드에서 실행된다는 점을 기억해야합니다. 따라서 로컬 작업자를 사용할 때 병렬 구조의 본문이 MATLAB에 의해 암시 적으로 멀티 스레드 될 수 없을 때만 속도 향상을 기대할 수 있습니다.

마지막으로

,이 특별한 경우에, 당신은 너무 같은 (또는 이상 R2016b에서 암시 적 확장 또는) bsxfun을 개시 훨씬 더 위치 :

T  = 10; 
n  = 7; 
alpha = rand(n, T); 
phi  = rand(n, T); 
alpha_r = reshape(alpha, n, 1, T); 
phi_r = reshape(phi, 1, n, T); 
% In R2016b or later: 
kesi = alpha_r + phi_r; 
% In R2016a or earlier: 
kesi = bsxfun(@plus, alpha_r, phi_r); 
+0

선생님,이 부분에 대한 공식적인 참조가 있으십니까? "(기본적으로) 병렬 풀 작업자는 단일 계산 스레드 모드로 실행되므로 로컬 근로자를 사용할 때 병렬 구조의 본문이 MATLAB에 의해 암시 적으로 멀티 스레드 될 수없는 경우에만 속도 향상을 기대할 수 있습니다." –

+0

이 R2016b 릴리스 노트는 http://www.mathworks.com/help/distcomp/release-notes.html#bvczl_g-1을 의미하지만 더 구체적인 doc 링크를 찾을 수는 없습니다. Parallel Computing Toolbox의 첫 번째 릴리스가 2005 년 (또는 2004 년) 이후로 분명히있었습니다. – Edric