Main Content

parfor 루프 반복이 서로 독립적이어야 함

for 루프를 parfor 루프로 변환할 때 오류가 발생하는 경우 parfor 루프 반복이 서로 독립적임을 확인하십시오. parfor 루프 반복은 정해진 순서가 없지만 for 루프의 반복 순서는 순차적입니다. 또한 parfor 루프 반복은 병렬 풀의 다른 MATLAB® 워커에서 수행되므로 반복 간에 정보를 공유하지 않습니다. 따라서 하나의 parfor 루프 반복은 이전 반복의 결과에 영향을 받지 않아야 합니다. 이 규칙은 Reduction Variables를 사용하여 루프의 값을 누적하는 경우에만 적용되지 않습니다.

다음 예제에서 생성되는 결과는 동일하나, 왼쪽에서는 for 루프를 오른쪽에서는 parfor 루프를 사용합니다. MATLAB 명령 창에서 이 예제를 따라해 보십시오.

clear A
for i = 1:8
    A(i) = i;
end
A
A =

     1     2     3     4     5     6     7     8
clear A
parfor i = 1:8
    A(i) = i;
end
A
A =

     1     2     3     4     5     6     7     8

A의 각 요소는 A의 인덱스와 같습니다. 각 요소는 인덱싱된 루프 변수에 의해서만 결정되고 다른 변수에 종속되지 않으므로 parfor 루프는 제대로 동작합니다. 독립적인 작업을 갖는 for 루프는 이상적인 parfor 루프 변환 후보입니다.

참고

기본적으로 parfor는 병렬 풀이 아직 시작되지 않은 경우 자동으로 워커의 병렬 풀을 시작합니다. parfor는 병렬 기본 설정이 적절하게 설정된 경우 디폴트 클러스터 프로파일을 사용하여 풀을 만듭니다.

이 예제에서 배열 요소는 for 루프와 마찬가지로 parfor 루프 이후 클라이언트 작업 공간에서 사용할 수 있습니다.

이번에는 루프 내에 인덱싱되지 않은 변수를 사용하거나 변수의 인덱싱이 루프 변수 i에 종속되지 않는 변수를 사용해 보겠습니다. 다음 예제를 따라해 보고 이후의 di의 값을 확인해 보십시오.

clear A
d = 0; i = 0;
for i = 1:4
    d = i*2;
    A(i) = d;
end
A
d
i
A =

     2     4     6     8

d =

     8

i =

     4
clear A
d = 0; i = 0;
parfor i = 1:4
    d = i*2;
    A(i) = d;
end
A
d
i
A =

     2     4     6     8

d =

     0

i =

     0

A의 요소는 두 예제에서 동일하지만 d의 값은 그렇지 않습니다. for 루프에서 반복은 순차적으로 실행되므로 이후 d는 루프의 마지막 반복에서 저장한 값을 갖습니다. 그러나 parfor 루프에서 반복은 병렬로 실행하므로 d에 루프의 마지막에 정의한 값을 할당할 수 없습니다. 이 상황은 루프 변수 i에도 적용됩니다. 따라서 parfor 루프 동작은 루프 외부의 값 di에 영향을 미치지 않도록 정의됩니다. 두 변수의 값은 루프 전과 후에도 동일합니다. parfor 루프의 변수가 독립적이지 않은 경우에는 for 루프의 변수와 답이 다를 수 있습니다. 요약에서 parfor 루프는 각 반복이 다른 반복과 서로 독립적이어야 합니다. parfor 문 다음에 나오는 모든 코드는 루프 반복 시퀀스에 종속되지 않아야 합니다.

코드 분석기는 루프 반복이 종속적인지 여부를 진단하는 데 도움이 됩니다. 다음 예제의 코드는 이전 반복의 값을 사용해 정의되는 반복을 보여줍니다.

parfor k = 2:10
    x(k) = x(k-1) + k;
end
MATLAB 편집기에서 코드 분석기 메시지를 확인하십시오. 이 경우 코드 분석기는 종속성 문제를 보고합니다.

Code Analyzer message reporting an issue on line 2. It explains that in a parfor-loop, variable 'x' is indexed in different ways, potentially causing dependencies between iterations.

그러나 그 밖의 경우 코드 분석기는 종속성을 표시할 수 없습니다.

다른 일반적인 parfor 문제에 대한 자세한 내용은 중첩 parfor 루프와 중첩 for 루프 및 기타 parfor 요구 사항 항목을 참조하십시오.

참고 항목

관련 예제

세부 정보