Main Content

parfeval

병렬 풀 워커에서 함수 실행

설명

예제

F = parfeval(fcn,numFcnOut,X1,...,Xm)은 함수 fcn이 실행되도록 예약합니다. MATLAB®은 사용 가능한 병렬 풀이 있으면 이를 사용하여 함수를 실행합니다. 그렇지 않으면 함수를 직렬로 실행합니다.

이 구문을 사용하는 병렬 코드를 Parallel Computing Toolbox™가 없는 MATLAB 사용자와 공유할 수 있습니다.

MATLAB은 지정된 입력 인수 X1,…Xm을 사용하여 각 워커에서 함수 fcn을 비동기식으로 실행하고 numFcnOut개의 출력 인수를 반환합니다.

MATLAB은 함수 fcn이 실행을 완료하기 전에 Future 객체 F를 반환합니다. fetchOutputs를 사용하여 Future에서 결과를 가져올 수 있습니다. 함수 fcn의 실행을 중지하려면 cancel 함수를 사용하십시오. Future에 대한 자세한 내용은 Future 항목을 참조하십시오.

병렬 풀이 열려 있는 경우 MATLAB은 이 병렬 풀을 사용하여 함수 fcn을 실행합니다.

병렬 풀이 열려 있지 않은 경우, 자동 풀 생성이 활성화되어 있는지 여부에 따라 동작이 달라집니다.

  • 자동 풀 생성이 활성화되어 있는 경우 — MATLAB은 디폴트 클러스터 프로파일을 사용하여 병렬 풀을 시작한 다음, 이 병렬 풀을 사용하여 함수 fcn을 실행합니다. 자동 풀 생성은 기본적으로 활성화되어 있습니다.

    parpool을 풀 인수 pool에 지정하여 이 동작을 직접 강제 적용할 수 있습니다.

  • 자동 풀 생성이 비활성화되어 있는 경우 — MATLAB은 지연 실행을 사용하여 함수 fcn을 실행합니다.

    parallel.Pool.empty를 풀 인수 pool에 지정하여 이 동작을 직접 강제 적용할 수 있습니다.

예제

F = parfeval(pool,fcn,numFcnOut,X1,...,Xm)은 함수 fcn이 풀 pool을 사용하여 실행되도록 예약합니다. 런타임에 풀을 지정하려는 경우 이 구문을 사용하십시오.

백그라운드에서 코드를 실행하려면 MATLAB 함수 페이지 parfeval을 참조하십시오.

예제

모두 축소

parfeval을 사용하여 워커에서 비동기식 함수 실행을 요청할 수 있습니다.

병렬 풀에 단일 요청을 제출합니다. fetchOutputs 함수를 사용하여 출력값을 가져옵니다.

f = parfeval(@magic,1,10);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.
value = fetchOutputs(f);
value(1)
ans = 92

for 루프 안에 여러 Future 요청을 지정하고 결과가 나오는 대로 벡터에서 결과를 수집합니다. 효율성을 위해서 루프를 시작하기 전에 Future 객체로 구성된 배열을 사전할당합니다.

f(1:10) = parallel.FevalFuture;
for idx = 1:10
    f(idx) = parfeval(@magic,1,idx);
end

fetchNext를 사용하여 개별 Future 출력값이 나오는 대로 가져옵니다. fetchNext 호출 시 사용 가능한 FevalFuture 객체 배열의 요소가 없는 경우 MATLAB은 사용 가능한 요소가 생길 때까지 기다립니다.

magicResults = cell(1,10);
for idx = 1:10
    [completedIdx,value] = fetchNext(f);
    magicResults{completedIdx} = value;
    fprintf("Got result with index: %d.\n",completedIdx)
end
Got result with index: 1.
Got result with index: 2.
Got result with index: 3.
Got result with index: 7.
Got result with index: 8.
Got result with index: 9.
Got result with index: 10.
Got result with index: 4.
Got result with index: 5.
Got result with index: 6.

원격 클러스터 프로파일 myMJSCluster를 사용하여 병렬 풀을 시작합니다.

myClusterPool = parpool(myMJSCluster,15);
Starting parallel pool (parpool) using the 'myMJSCluster' profile ...
Connected to parallel pool with 15 workers.

parfeval을 사용하여 풀 myClusterPool에서 1000×1000 행렬의 각 열에 있는 요소의 합을 계산합니다. 결과를 가져옵니다.

f = parfeval(myClusterPool,@sum,1,rand(1000));
results = fetchOutputs(f)'
results = 1000×1

  509.8296
  483.2762
  505.1542
  479.3408
  489.2463
  512.2336
  495.8580
  499.5442
  487.5374
  491.4364
      ⋮

이 예제에서는 계산이 완료될 때마다 사용자 인터페이스를 업데이트하는 방법을 보여줍니다. parfeval을 사용하여 워커에 계산을 분담시키는 경우 워커가 이러한 계산을 수행하는 동안 모든 사용자 인터페이스가 즉각적으로 반응합니다. waitbar를 사용하여 간단한 사용자 인터페이스를 만들 수 있습니다.

  • 각 계산이 완료된 후 사용자 인터페이스를 업데이트하려면 afterEach를 사용합니다.

  • 모든 계산이 완료된 후 사용자 인터페이스를 업데이트하려면 afterAll을 사용합니다.

waitbar를 사용하여 Figure 핸들 h를 만듭니다. afterEach 또는 afterAll을 사용하면 waitbar 함수가 Figure 핸들을 업데이트합니다. 핸들 객체에 대한 자세한 내용은 핸들 객체 동작 항목을 참조하십시오.

h = waitbar(0,'Waiting...');

parfeval을 사용하여 확률 행렬의 고유값에서 실수부를 계산합니다. 디폴트 기본 설정을 사용하면 병렬 풀이 아직 생성되지 않은 경우 parfeval이 자동으로 병렬 풀을 만듭니다. 효율성을 위해서 Future 객체로 구성된 배열을 사전할당합니다.

f(1:100) = parallel.FevalFuture;
for idx = 1:100
    f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); 
end

afterEach를 사용하면 parfeval의 각 계산 결과마다 자동으로 함수를 호출할 수 있습니다. afterEach를 사용하여 또 다른 일련의 Future 객체를 예약하면 f의 각 Future가 완료된 후 각 출력 배열에서 가장 큰 값을 계산합니다.

maxFuture = afterEach(f,@max,1);

State 속성을 사용하여 Future의 상태를 가져올 수 있습니다. h의 대기 표시줄의 길이 소수 값을 실행이 완료된 Future 객체의 소수 값으로 업데이트하는 익명 함수를 정의합니다. updateWaitbar 익명 함수는 f에서 Future 객체의 State 속성이 "finished"인 경우 대응하는 요소가 true인 논리형 배열의 평균을 계산합니다.

updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);

afterEachupdateWaitbar를 사용하여 maxFuture의 각 Future가 완료된 후 대기 표시줄의 길이 소수 값을 업데이트합니다. afterAlldelete를 사용하여 모든 계산이 완료된 후 대기 표시줄을 닫습니다.

updateWaitbarFutures = afterEach(f,updateWaitbar,0);
afterAll(updateWaitbarFutures,@(~) delete(h),0)

afterAllhistogram을 사용하여 모든 Future가 완료된 후 maxFuture의 결과를 히스토그램으로 표시합니다.

showsHistogramFuture = afterAll(maxFuture,@histogram,0);

입력 인수

모두 축소

워커에서 실행할 함수로, 함수 핸들로 지정됩니다.

예: fcn = @sum

데이터형: function_handle

함수 fcn에서 요청된 출력 인수 개수로, 음이 아닌 정수로 지정됩니다.

numFcnOutfcn(X1,...,Xm) 실행 시 요청한 출력 인수 개수입니다.

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

입력 인수로, 변수 또는 표현식이 쉼표로 구분된 목록으로 지정됩니다. 병렬 풀 워커는 이러한 인수를 함수 fcn에 입력합니다.

풀로, parallel.Pool 객체로 지정됩니다.

  • 병렬 풀을 만들려면 parpool을 사용합니다.

  • 백그라운드 풀을 가져오려면 backgroundPool을 사용합니다.

예: parpool("Processes");

예: backgroundPool;

출력 인수

모두 축소

Future로, parallel.FevalFuture 객체로 반환됩니다.

  • F에서 결과를 가져오려면 fetchOutputs 또는 fetchNext를 사용합니다.

  • F가 하나의 계산 또는 모든 계산을 완료할 때 함수를 실행하려면 각각 afterEach 또는 afterAll을 사용합니다.

확장 기능

버전 내역

R2013b에 개발됨

모두 확장