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
에 종속되지 않는 변수를 사용해 보겠습니다. 다음 예제를 따라해 보고 이후의 d
와 i
의 값을 확인해 보십시오.
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
루프 동작은 루프 외부의 값 d
와 i
에 영향을 미치지 않도록 정의됩니다. 두 변수의 값은 루프 전과 후에도 동일합니다. parfor
루프의 변수가 독립적이지 않은 경우에는 for
루프의 변수와 답이 다를 수 있습니다. 요약에서 parfor
루프는 각 반복이 다른 반복과 서로 독립적이어야 합니다. parfor
문 다음에 나오는 모든 코드는 루프 반복 시퀀스에 종속되지 않아야 합니다.
코드 분석기는 루프 반복이 종속적인지 여부를 진단하는 데 도움이 됩니다. 다음 예제의 코드는 이전 반복의 값을 사용해 정의되는 반복을 보여줍니다.
parfor k = 2:10 x(k) = x(k-1) + k; end
그러나 그 밖의 경우 코드 분석기는 종속성을 표시할 수 없습니다.
다른 일반적인 parfor
문제에 대한 자세한 내용은 중첩 parfor 루프와 중첩 for 루프 및 기타 parfor 요구 사항 항목을 참조하십시오.
참고 항목
관련 예제
- parfor를 언제 사용할지 결정하기
- for 루프를 parfor 루프로 변환하기
- 중첩 parfor 루프와 중첩 for 루프 및 기타 parfor 요구 사항
- parfor 루프에서 변수 문제 해결하기
- Reduction Variables