Main Content

parfor

여러 워커에서 병렬로for루프 반복 실행

설명

예제

parforloopVar=initVal:endVal;statements; end는 병렬 풀에 있는 워커들에서for루프 반복을 병렬로 실행합니다.

MATLAB®initValendVal사이의loopVar값에 대해 루프 본문 명령statements를 실행합니다.loopVar은 1씩 증가하는 정수 값으로 구성된 벡터를 지정합니다. Parallel Computing Toolbox™가 있으면 멀티코어 컴퓨터 또는 클러스터에 병렬 풀로 조직된 워커들을 사용하여statements반복을 실행할 수 있습니다.for루프와 마찬가지로statements에 한 줄 또는 여러 줄을 포함할 수 있습니다.

parfor를 사용하여 처리량을 증가시킬 수 있는 방법을 알아보려면parfor를 언제 사용할지 결정하기항목을 참조하십시오.

parfor는 기존의for루프와는 다음과 같이 다릅니다.

예제

parfor (loopVar=initVal:endVal,M);statements; end루프 본문에 있는statements를 실행할 때 사용할 병렬 풀의 최대 워커 개수를M을 사용하여 지정합니다.M은 음이 아닌 정수여야 합니다.

기본적으로 MATLAB은 사용자의 병렬 풀에 있는 워커들을 사용합니다.탭의환경섹션에서병렬연산>병렬 기본 설정을 선택하여 워커 개수를 변경할 수 있습니다.parpool을 사용하여 병렬 풀의 디폴트 워커 개수를 재정의할 수 있습니다. 풀에 사용 가능한 워커가 없거나M이 0인 경우, MATLAB은 병렬 연산을 수행하지는 않지만 계속 비결정적 순서로 루프 본문을 실행합니다. 이 구문을 사용하면 코드를 테스트할 때 병렬 실행과 직렬 실행 간에 전환할 수 있습니다.

이 구문을 사용하여 반복을 병렬로 실행하려면 워커로 구성된 병렬 풀이 있어야 합니다. 기본적으로parfor를 실행하면, 디폴트 클러스터 프로파일로 정의된 클러스터에 워커로 구성된 병렬 풀이 자동으로 만들어집니다. 디폴트 클러스터는local입니다.병렬 기본 설정에서 클러스터를 변경할 수 있습니다. 자세한 내용은병렬 기본 설정 지정하기항목을 참조하십시오.

parfor (loopVar=initVal:endVal,opts);statements; end는 루프 본문에 있는statements를실행할때사용할리소스를opts를 사용하여 지정합니다.parfor옵션 세트는parforOptions함수를 사용하여 만들 수 있습니다. 이 방식에서는 먼저 병렬 풀을 만들지 않고도 클러스터에서parfor를 실행할 수 있으며parfor가 반복을 워커의 부분 범위로 분할하는 방식을 제어할 수 있습니다.

예제

parfor (loopVar=initVal:endVal,cluster);statements; end는 병렬 풀을 만들지 않고cluster의 워커에서statements를 실행합니다. 이는parfor (loopVar = initVal:endVal,parforOptions(cluster)); statements; end를 실행하는 것과 동일합니다.

예제

모두 축소

계산량이 많은 작업에 대해parfor루프를 만들고 속도 향상 결과를 측정합니다.

MATLAB 편집기에서 다음for루프를 입력합니다. 경과된 시간을 측정하려면tictoc을 추가하십시오.

tic n = 200; A = 500; a = zeros(1,n);fori = 1:n a(i) = max(abs(eig(rand(A))));endtoc

스크립트를 실행하고 경과 시간을 확인합니다.

Elapsed time is 31.935373 seconds.

스크립트에서for루프를parfor루프로 바꿉니다.

tic n = 200; A = 500; a = zeros(1,n);parfori = 1:n a(i) = max(abs(eig(rand(A))));endtoc

새 스크립트를 실행하고 다시 실행합니다. 병렬 풀을 시작하고 워커에 사용 가능한 코드를 만들어야 하기 때문에 첫 번째 실행이 두 번째 실행보다 느립니다. 두 번째 실행의 경과 시간을 확인합니다.

기본적으로 MATLAB은 로컬 컴퓨터에서 워커의 병렬 풀을 자동으로 엽니다.

Elapsed time is 10.760068 seconds.

4개의 워커에서for루프를parfor루프로 변환하여 계산 속도가 향상되는지 확인합니다. 병렬 풀의 워커 수를 늘리면 경과 시간을 더 줄일 수도 있습니다. 자세한 내용은for 루프를 parfor 루프로 변환하기항목과parfor 루프를 클러스터 및 클라우드로 확장하기항목을 참조하십시오.

parfor루프의 최대 워커 개수M을 지정할 수 있습니다. 풀이 열려 있는 경우에도M = 0을 설정하면 데스크탑 MATLAB에서 루프의 본문을 워커를 사용하지 않고 실행할 수 있습니다.M = 0이면 MATLAB이 병렬은 아니지만 비결정적 순서로 루프 본문을 계속 실행하므로parfor루프가 독립적이며 워커에서 실행되기 적합한지 확인할 수 있습니다. 이 방법을 통해 가장 간단히parfor루프의 내용을 디버그할 수 있습니다.parfor루프 본문에 직접 중단점을 설정할 수는 없지만parfor루프 본문에서 호출된 함수에 중단점을 설정할 수 있습니다.

M = 0을 지정하여 풀이 열려 있는 경우에도 데스크탑 MATLAB에서parfor루프의 본문을 실행합니다.

M = 0;% M specifies maximum number of workersy = ones(1,100);parfor(i = 1:100,M) y(i) = i;end

병렬 풀의 워커 개수를 제어하려면병렬 기본 설정 지정하기parpool을 참조하십시오.

현재 병렬 풀의 워커 간 데이터 전송량을 측정하려면parfor루프 전과 후에ticBytes(gcp)tocBytes(gcp)를 추가하십시오.gcp를 인수로 사용하여 현재 병렬 풀을 가져옵니다.

현재 병렬 풀을 삭제합니다(아직 있는 경우).

delete(gcp('nocreate'))
tic ticBytes(gcp); n = 200; A = 500; a = zeros(1,n);parfori = 1:n a(i) = max(abs(eig(rand(A))));endtocBytes(gcp) toc

새 스크립트를 실행하고 다시 실행합니다. 병렬 풀을 시작하고 워커에 사용 가능한 코드를 만들어야 하기 때문에 첫 번째 실행이 두 번째 실행보다 느립니다.

기본적으로 MATLAB은 로컬 컴퓨터에서 워커의 병렬 풀을 자동으로 엽니다.

Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers. ... BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 Total 55324 24168

ticBytestocBytes결과를 사용하여 병렬 풀의 워커 간 데이터 전송량을 검토할 수 있습니다. 이 예제에서는 데이터 전송량이 적습니다.parfor루프에 대한 자세한 내용은parfor를 언제 사용할지 결정하기for 루프를 parfor 루프로 변환하기항목을 참조하십시오.

parcluster함수를 사용하여 cluster 객체를 만들고parfor옵션 세트도 만듭니다. 기본적으로parcluster는 디폴트 클러스터 프로파일을 사용합니다. MATLAB탭의병렬연산>디폴트 클러스터 선택에서 디폴트 프로파일을 확인합니다.

cluster = parcluster;

클러스터에서 직접parfor계산을 실행하려면 cluster 객체를 두 번째 입력 인수로parfor에 전달하십시오.

이 방법을 사용할 경우parfor는 클러스터에서 사용 가능한 모든 워커를 사용할 수 있으며 루프가 완료되는 즉시 워커는 다시 사용 가능한 상태가 됩니다. 이 방법은 클러스터가 병렬 풀을 지원하지 않는 경우에도 유용합니다. 반복을 분할하는 등의 다른 옵션을 제어하려면parforOptions를 사용하십시오.

values = [3 3 3 7 3 3 3];parfor(i=1:numel(values),cluster) out(i) = norm(pinv(rand(values(i)*1e3)));end

이 구문을 사용하면 워커를 필요 이상으로 사용하지 않고 큰 클러스터에서 parfor를 실행할 수 있습니다.

입력 인수

모두 축소

초기값이initVal이고 최종 값이endVal인 루프 인덱스 변수. 변수는 임의의 숫자형일 수 있으며, 값은 정수여야 합니다.

parfor루프변수는연속으로증가하는정수여야합니다。자세한내용은parfor 루프에서 변수 문제 해결하기항목을 참조하십시오.

parfor루프 변수의 범위는 지원되는 범위를 초과해서는 안 됩니다. 자세한 내용은parfor 루프에서 오버플로 방지하기항목을 참조하십시오.

데이터형:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

루프 인덱스loopVar의 초기값 변수. 변수는 임의의 숫자형일 수 있으며, 값은 정수여야 합니다.endVal과 함께parfor범위 벡터를M:N형식으로 지정합니다.

데이터형:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

루프 인덱스loopVar의 최종 값 변수. 변수는 임의의 숫자형일 수 있으며, 값은 정수여야 합니다.initVal과 함께parfor범위 벡터를M:N형식으로 지정합니다.

데이터형:single|double|int8|int16|int32|int64|uint8|uint16|uint32|uint64

루프 본문으로, 텍스트로 지정됩니다.parfor루프에서 실행할 일련의 MATLAB 명령.

parfor루프를 사용하려면 코드를 수정해야 할 수 있습니다. 자세한 내용은for 루프를 parfor 루프로 변환하기항목을 참조하십시오.

parfor루프를 중첩시키지 마십시오.중첩 parfor 루프와 중첩 for 루프 및 기타 parfor 요구 사항항목을 참조하십시오.

병렬로실행하는최대 워커 개수로, 음이 아닌 정수로 지정됩니다. 이 상한을 지정할 경우, MATLAB은 추가 워커를 사용할 수 있는 경우에도 이 숫자보다 많이 사용하지 않습니다. 사용 가능한 워커 개수보다 많은 워커를 요청할 경우, MATLAB은 호출 시점에 사용 가능한 최대 워커 개수를 사용합니다. 루프 반복이 워커 개수보다 적은 경우, 일부 워커는 작업을 수행하지 않습니다.

parfor가 여러 워커에서 실행될 수 없는 경우(예를 들어, 하나의 코어만 사용할 수 있거나M이 0인 경우), MATLAB은 직렬 방식으로 루프를 실행합니다. 이 경우에도 MATLAB은 계속해서 비결정적 순서로 루프 본문을 실행합니다. 이 구문을 사용하면 코드를 테스트할 때 병렬과 직렬 간에 전환할 수 있습니다.

parfor옵션으로,ClusterOptions객체로 지정됩니다.parfor옵션 세트는parforOptions함수를 사용하여 만들 수 있습니다.

예:opts = parforOptions(parcluster);

parfor가 실행될 클러스터이며parallel.Cluster객체로 지정됩니다. cluster 객체를 만들려면parcluster함수를 사용하십시오.

예:cluster = parcluster('local')

데이터형:parallel.Cluster

  • 다음과 같은 경우에parfor를 사용합니다.

    • 간단한 계산으로 구성된 루프 반복이 많이 있는 경우.parfor는 루프 반복을 그룹으로 나누고 각 스레드가 하나의 반복 그룹을 실행할 수 있도록 합니다.

    • 실행 시간이 오래 걸리는 일부 루프 반복이 있는 경우.

  • 루프의 반복이 다른 반복 결과에 따라 달라지는 경우에는parfor루프를 사용하지 마십시오.

    귀결(Reduction)은 이 규칙에 대한 한 가지 예외입니다.귀결변수는 매 반복마다 달라지는 값을 계속 누적하지만 반복 회차 간에는 독립적인 값을 가집니다. 자세한 내용은Reduction Variables항목을 참조하십시오.

  • parfor를 사용하는 경우 결과를 얻으려면 루프가 완료되기를 기다려야 합니다. 클라이언트 MATLAB이 차단되어 루프를 일찍 중단할 수 없습니다. 중간 결과를 구하거나for루프를 일찍 중단하려면 대신parfeval을 사용해 보십시오.

  • cluster 객체를 지정하지 않는 한parfor루프는 기존 병렬 풀에서 실행됩니다. 풀이 없는 경우, 병렬 기본 설정에서 자동 풀 시작이 비활성화되어 있지 않는 한parfor는 새 병렬 풀을 시작합니다. 병렬 풀이 없는 경우와parfor가 병렬 풀을 시작할 수 없는 경우에는 루프가 클라이언트 세션에서 직렬로 실행됩니다.

  • 병렬 풀에 대한 클러스터 프로파일의AutoAttachFiles속성이true로 설정된 경우, MATLAB이parfor루프를 분석하여 루프 실행에 필요한 코드 파일을 결정합니다.listAutoAttachedFiles를 참조하십시오. MATLAB은 코드가 워커에 사용될 수 있도록 병렬 풀에 이러한 코드 파일을 자동으로 연결합니다.

  • parfor루프에서 직접 스크립트를 호출할 수는 없습니다. 대신, 스크립트를 호출하는 함수를 호출할 수 있습니다.

  • clear는 작업 공간 투명성을 위반하므로parfor루프 내에서 사용하지 마십시오.parfor 루프 또는 spmd 문에서 투명성 확보하기항목을 참조하십시오.

  • parfor루프를 사용하는 대신parsim명령을 사용하여 Simulink®모델을 병렬로 실행할 수 있습니다. Simulink의 병렬 사용에 대한 자세한 내용과 예제는Running Multiple Simulations(Simulink)항목을 참조하십시오.

버전 내역

R2008a에 개발됨