2012-03-30 4 views
5

matlab에서 오랫동안 실행되는 parfor 루프로 작업하고 있습니다.Matlab 병렬 컴퓨팅 도구 상자, parfor 루프에서의 동적 할당

parfor iter=1:1000 
    chunk_of_work(iter); 
end 

일반적으로 실행 당 약 2-3 개의 시간 초과 값이 있습니다. 즉, 수행되는 1000 개의 작업 청크마다 2-3 시간이 나머지 시간보다 약 100 배 더 오래 걸린다는 것입니다. 루프가 완료됨에 따라 이상 치를 평가 한 작업자는 계속 실행되지만 나머지 작업자에게는 계산 부하가 없습니다.

이것은 정적으로 작업을 배포하는 parfor 루프와 일치합니다. 이러한 병렬 컴퓨팅 툴박스 found here 설명서와 대조적이다.

"작업 분포가 동적 대신 고정 반복 영역이 할당되는 노동자들은 그들의 처리를 완료 만 후 새로운 반복을 할당 현재의 반복으로 인해 작업 부하 분포가 발생합니다. "

무슨 일인지에 대한 아이디어가 있습니까?

답변

5

나는 당신이 인용 한 문서가 정적 인 작업 할당으로 간주되는 꽤 좋은 설명을 가지고 있다고 생각한다 : 각 작업자는 "고정 된 반복 범위를 할당 받는다". 4 명의 작업자의 경우 첫 번째 작업은 iter 1 : 250, 두 번째 작업은 iter 251 : 500, ... 또는 첫 번째 작업에는 1 : 4 : 100, 두 번째 작업에는 2 : 4 : 1000 등이 할당됩니다.

당신은 정확히 무엇을 말하지 않았지만, 당신이 묘사 한 것은 역동적 인 작업량 분배와 잘 일치합니다. 첫째, 네 명의 (예) 근로자가 각각 하나씩 iter에서 일하고, 끝난 첫 번째 근로자는 다섯 번째, 다음에 수행되는 작업 (첫 번째 네 개 중 세 개 중 세 개가 다소 오래 걸리는 경우에도 동일 할 수 있음)은 여섯 번째 작업 등입니다. 이제 MATLAB이 루프 반복을 처리하기 위해 선택한 순번으로 20, 850 및 900의 값을 얻었을 때 각각 100 배의 시간이 걸리므로 21 번째에서 320 번째 반복이 4 명의 작업자 중 3 명에 의해 해결 될 것입니다. 20 분과 함께 바쁘다 (320에 의해, 이제는 비외 각 계산 시간의 대략 균등 분포 가정). 그러나 850 번째 반복 작업을 할당받은 작업자는 다른 작업이 # 1000을 수행 한 후에도 계속 실행되며 # 900 작업도 동일하게 실행됩니다. 실제로, 약 1100 번의 반복이 있었다면, # 900에서 작업하는 사람은 다른 사람이있을 때 대략 완료해야합니다. 당신이 방법을 찾을하지 않는 한,

너무 오래 짧은 이야기 [가정해서는 안 MATLAB은 여전히 ​​1000 1부터 순서대로 parfor 루프의 반복을 할당합니다 암시 orginal 한 표현으로을 편집 ]

아웃 라이어를 먼저 처리해야합니다 (어떤 것들은 아웃 라이어인지 선험적으로 알아야하며, MATLAB이 이들과 함께 parfor 루프 처리를 시작하는 방법을 찾으려면 동적 워크로드 배포만으로는 사용자가 관찰 한 효과를 피할 수 없습니다).

추가 : 제 생각에는, 그러나, "루프가 완성에 가까워, 노동자가 * 아웃 라이어 계속 실행 평가 *가"로 다음과 같은

    중 하나 이상을 의미하는 것으로 보인다 귀하의 관찰
  1. 아웃 라이어 든 반복 횟수의 크기 순으로, MATLAB 당신은 많은 노동자가
  2. 를 처리하기 시작 마지막 반복 중입니다
  3. 이상치의 수 (2-3) 또는 추정 귀하의 추정 그들의 계산 시간 패널티 (factor 100)가 너무 낮다.
3

PARFOR의 작업 분포는 다소 결정적입니다. 각 작업자가 디스크에 로그하는 방식으로 작업 내용을 정확하게 관찰 할 수 있지만 기본적으로 PARFOR는 루프를 결정적 방식으로 청크로 나눕니다. 그러나 동적으로 생성합니다. 안타깝게도 현재 청킹을 제어 할 수있는 방법은 없습니다.

그러나 1,000 개의 사례 중 아웃 라이어가 될 것으로 예측할 수없는 경우 작업을 배포하기위한 효율적인 계획을 상상하기가 어렵습니다.

아웃 라이어를 예측할 수 있다면 대략적으로 말하면 PARFOR은 루프 반복을 역순으로 실행하므로 루프의 "끝"에 놓을 수 있으므로 작업이 시작됩니다. 즉시.

3

당신이 직면 한 문제는 @ arne.b의 대답에 잘 설명되어 있습니다.

그러나 병렬 계산 도구 상자에는 독립적 실행을 위해 job into tasks을 분해하는 함수가 포함되어 있습니다. 귀하의 질문에서 이것이 적합하거나 귀하의 신청서에 적합하지 않다고 결론 내릴 수는 없습니다. 그렇다면 일반적인 전략은 작업을 일정 크기의 작업으로 분해하고 각 프로세서가 작업을 완료하도록하고 작업이 완료되면 완료되지 않은 작업 스택으로 돌아가서 다른 작업을 시작하는 것입니다.

하나의 작업이 하나의 루프 반복 (많은 작업, 계산 관리에 많은 부하가 걸리지 만 부하 분산이 가장 좋습니다)을 대체하거나 하나의 작업이 N 개의 루프 반복을 대체하도록 문제를 분해 할 수 있습니다 , 적은 오버 헤드, 낮은로드 균형 조정). 작업과 작업은 parfor보다 약간 구현하기가 까다 롭습니다.

0

PARFOR 대신 R2013b 이상에서 PARFEVAL을 사용할 수 있으며 어떤 방식 으로든 작업을 나눌 수 있습니다. 적절한 경우 충분한 결과를 얻으면 '시간 초과 값'을 취소 할 수도 있습니다. 기존 루프를 1000 개의 개별 원격 PARFEVAL 호출로 나누면 오버 헤드가 발생합니다. 아마 그것은 문제 일 것입니다. 아마 그렇지 않을 수도 있습니다. 여기에 내가 상상하는 것입니다 :

for idx = 1:1000 
    futures(idx) = parfeval(@chunk_of_work, 1, idx); 
end 
done = false; numComplete = 0; 
timer = tic(); 
while ~done 
    [idx, result] = fetchNext(futures, 10); % wait up to 10 seconds 
    if ~isempty(idx) 
     numComplete = numComplete + 1; 
     % stash result 
    end 
    done = (numComplete == 1000) || (toc(timer) > 100); 
end 
% cancel outstanding work, has no effect on completed futures 
cancel(futures); 
관련 문제