이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

parfor

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

설명

예제

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

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

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);
for i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

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

Elapsed time is 31.935373 seconds.

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

tic
n = 200;
A = 500;
a = zeros(1,n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

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

기본적으로 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 workers
 y = 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);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
tocBytes(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의 병렬 사용에 대한 자세한 내용과 예제는 Run Multiple Simulations (Simulink) 항목을 참조하십시오.

R2008a에 개발됨