2012-07-04 3 views
0

저는 parfor loop가 100 회 반복되는 것을 보았습니다. 모든 반복마다 작업 부하는 다르지만 첫 번째 작업이 가장 오래 걸리고 마지막 작업이 가장 빠르다는 방식으로 선형 적으로 변경됩니다. 그러나 4 개의 인스턴스/실험실과 함께 parfor 루프를 실행할 때 마지막 몇 시간 동안 단 하나의 실험실 만이 처음 몇 번의 반복을 거치면서 활성화됩니다.Matlab parfor 작업 배포판

그래서 어떤 반복이 느린 것들인지 압니다. 어떻게하면 코어 간 작업 부하를 더 균등하게 만들 수 있습니까? 예를 들어 어떻게 든 모든 실험실이 처음 4 개의 느린 작업을 시작한 다음 순서대로 진행하도록합니다. 아니면 단지 하나의 활성 코어가 느린 것을 실행하는 하나의 활성 코어를 막기 위해 비슷합니다.

+3

저는 http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-forfor-loops/9939455#9939455에 대한 답변이 흥미로울 것이라고 생각합니다. 너에게. –

+1

나는 [@Edric] (http://stackoverflow.com/a/9938666/97160)이 링크 된 질문에 힌트를 주었다고 생각한다.'대략 말하면, PARFOR는 루프 반복을 역순으로 실행하기 때문에, end "루프를 사용하여 즉시 작업을 시작할 수 있습니다. – Amro

+0

@HighPerormanceMark : 중복으로 간주해야합니까? – Amro

답변

2

Matlab parfor는 인덱스를 분할하여 작업자에게 배포합니다. 이는 인덱스에서 연속 된 청크를 만들어서 수행합니다. 나는 정확한 알고리즘을 모른다. 그러나 이것은 유사한 색인을 가진 데이터가 같은 청크에서 그리고 동일한 작업자에 의해 계산된다는 것을 의미한다.

가장 간단한 해결 방법은 확률적인 방법입니다. 작업 집약적 인 단계가 잘 분산되도록 색인을 섞으십시오. 이것이 성능에 대한 어떠한 보증도 제공하지는 않지만 간단하며 대부분의 경우 작동합니다.

일부 예제 코드 :

% dummy data 
N=10; 
data=1:N; 

% generate the permutated indices 
permIndex=randperm(N); 

% permute the data 
dataPermuted=data(permIndex); 

% run the loop 
parfor i=1:N 
    % do something e.g. pause for the time as specified by data 
    pause(dataPermuted(i)); 
end 

%invert the index permutation 
dataInversePermuted(permIndex)=dataPermuted; 

나는 다른 계산 시간을 시뮬레이션하기 위해 일시 ​​정지를 사용했다.

+0

"그래서 worker1은 i1 = 1 : 100 및 worker2 i2 = 101 : 200으로 모든 것을 처리합니다." -이 정보는 어디에서 가져 옵니까? 그것은 [이전에 링크 된 질문] (http://stackoverflow.com/questions/9937200/matlab-parallel-computing-toolbox-dynamic-allocation-of-work-in-parfor-loops/9939455#)의 답변과 모순되는 것 같습니다. 9939455). –

+0

@ arne.b 사실 matlab은 이렇게 분할하지 않습니다. 제 관점은 인덱스의 범위가 인접한 덩어리로 나뉘어진다는 것입니다. 모든 시간 집중 단계가 서로 가깝다면 동일한 덩어리에있을 가능성이 큽니다. 나는 대답을 업데이트 할 것이다. – denahiro

1

나는 어디에도 문서화되어 있다고 생각하지 않지만 PARFOR가 역 루프 순서로 반복 실행한다는 것을 신속하게 추측 할 수 있습니다 (작동시 보려면 pausedisp 사용). 따라서 루프를 간단히 되돌려 야합니다. PARFOR는 명시 적으로 실행 순서를 제어 할 수있는 방법이 없지만 for-drange을 사용하는 SPMD (PARFOR는 사용하기가 훨씬 쉽습니다).

@ denahiro의 제안 또한 좋은 것입니다.