2014-04-10 4 views
0

Matlab 병렬 컴퓨팅 도구 상자 또는 Matlab 분산 서버 컴퓨팅을 사용하여 다음 단계 (가변적 인 단계 크기 구현)를 구현하려고하는 다음 의사 코드 (루프)가 있습니다. 사실, 나는이 루프 matlab에 코드를 가지고 일반 MATLAB 2013a에서 작동합니다.Parallel Computing Toolbox 또는 Matlab Distributed Computing 서버를 사용해야합니까?

을 감안할 때 : U0, t_0, T (초기 및 종료 시간 값), 초기 단계의 크기 :

while t_0 < T 

% the fist step is to compute U1, U2 which depend on t_0 and some known parameters 

U1(t_0, h0, u0, parameters) 

U2(t_0, h0, u0, parameters) 

% so U1 and U2 are independent, which can be computed in parallel using Matlab 

% the next step is to compute U3, U4, U5, U6 which depends on t_0, U1, U2, and known parameters 

U3(t_0, h0, u0, U1, U2, parameters) 

U4(t_0, h0, u0, U1, U2, parameters) 

U5(t_0, h0, u0, U1, U2, parameters) 

U6(t_0, h0, u0, U1, U2, parameters) 

% so U3, U4, U5, U6 are independent, which can be also computed in parallel using Matlab 

%finally, compute U7 and U8 which depend on U1,U2,..,U6 

U7(t0, u0,h0, U1,U2,U3,U4,U5,U6) 

U8(t0, u0,h0,U1,U2,U3,U4,U5,U6) 

% so U7 and U8 are also independent, and we can compute them in parallel as well. 

퍼센트 여기 스텝 크기 제어를 수행 H0은, 다음 지정 H0 = h_new
T0 = T0 + h_new

end 

당신이 나에게 matlab에 평행을 사용하여 위 코드를 구현하는 가장 좋은 방법을 제안시겠습니까? 가장 좋은 방법은 가능한 한 빨리 전체 계산 속도를 높이고 싶다는 것입니다. (저는 192 개의 컴퓨터 노드를 가진 슈퍼 컴퓨터 LEO III에 액세스 할 수 있습니다 (총 1944 코어). 따라서 각 노드에는 12 코어가 있습니다.)

제 아이디어는 U1, U2를 두 개의 별도 작업자) 자신의 기억을 가지고있는 동시에. U1, U2에 대해 얻은 결과를 사용하여 U3, U4, U5, U6을 계산하고 U7, U8을 계산할 수 있습니다. 이를 위해 Matlabpool에서 PARFOR를 사용해야한다고 생각하십니까? 하지만 루프에 필요한 인덱스 수 (코어/프로세서 수에 해당)를 모르겠습니다.

내 질문은 :

  1. 나는 위에서 언급 한 바와 같이 슈퍼 컴퓨터를 사용할 수 있습니다, 그래서 matlab에 분산 컴퓨팅 서버를 사용할 수 있습니까?

  2. 이 코드의 경우 Parallel Computing Toolbox 또는 Matlab Distributed Computing 서버를 사용해야합니까? Parallel Computing Toolbox (로컬 근로자)는 U1과 U2 (U3, U4 등)를 계산할 작업자를 지정하지 못합니다. 이들 작업은 메모리를 공유하고 대화식으로 실행되기 때문입니다. 그렇습니까?

  3. 제안 된 아이디어를 사용하려면 얼마나 많은 근로자가 필요합니까? 아마 8 코어? 1 개의 계산 노드를 사용하고 9 코어 (8 개는 사용하고 하나는 matlab 세션)를 요청하거나 8 개의 컴퓨터 노드를 사용하는 것이 더 좋습니까?

저는 Matlab 병렬 컴퓨팅의 초보자입니다. 의견을주십시오! 감사합니다.

피터

+0

T- 루프의 반복은 과거 반복에 따라 다릅니 까? – Jonas

+0

아니요, 그렇지 않습니다! T- 루프 (while 회 돌이)는 t_0 (초기)에서 T (종료 시간)까지의 시간 통합에만 해당됩니다. – user3517471

답변

0

난 당신이 노드간에 많은 반복을 배포 싶은 때문에, 동안 루프를 병렬화하는 것이 좋습니다. Parfor는 병렬 컴퓨팅으로 시작하는 가장 쉬운 방법이며, 직접 문제를 해결하는 데 도움이됩니다. 모든 병렬 처리에는 일정한 오버 헤드가 있으므로 시간이 많이 걸리면 상당한 시간이 소요되는 경우에만 서버로 이동하십시오.

로컬 컴퓨팅을 사용하면 최신 버전의 Matlab에서 12 코어를 사용할 수 있습니다. 루프 바디를 13 부 메모리에 저장할 수있는 충분한 RAM이 있는지 확인하십시오. 좋은 프로세서 아키텍처와 리소스를 놓고 경쟁하는 다른 프로그램이 없으면 모든 코어에서 실행하는 것이 좋습니다.따라서

:

timeSteps = t0:h:T; 

parfor timeIdx = 1:length(timeSteps) 
    t0 = timeSteps(timeIdx); 

    %# calculate all your u's here 

    %# collect the output 
    result{timeIdx,1} = U7; 
    result{timeIdx,2} = U8; 

end 
+0

답변 해 주셔서 감사합니다! 죄송하지만 가변 단계 크기 구현을하고 싶습니다. 즉, 단계 크기 h가 변경됨을 의미하며, 단계 크기 제어에 의해 선택됩니다. 위의 코드를 수정했습니다. 좀 봐주세요. 제 생각에 U1, U2, U3, U6, U7, U8 순으로 병렬 처리하고 싶습니다. – user3517471

+0

@ user3517471 U1 등 계산 시간은 얼마나 걸립니까? – Jonas

+0

문자의 제한 때문에 위의 대답으로 질문에 대답했습니다. 한번 봐주세요. – user3517471

0

I는 U1의 모든 계산을 말할 것이다 .. U8은 매트릭스 - 벡터 곱셈을 계산하는 함수를 호출 할 필요가있을 것이다. 우리는 그들이 얼마나 오래 그 순간에 (나는별로 중요하지 않은) 받아들이는지 신경 쓰지 않는다고 가정 해 봅시다. 문제는 이전 방법에서 U1, .., U8이 독립적이지 않다는 것입니다 (이들은 종속적입니다!). 즉, U_ {i + 1}을 계산하려면 U_ {i}가 필요합니다. 따라서 순차적으로 계산해야합니다. 이제는 U1, U2를 동시에 (독립적 인) 계산할 수있는 방법을 만들 수 있었고 U3, .., U6 및 U7, U8에 대해서도 마찬가지입니다. 그래서 전체 계산을 위해 CPU 시간을 절약하고 싶습니다. 왜 내가 matlab 병렬 컴퓨팅을 사용할 수 있을지 생각한다.

관련 문제