이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
parfeval
병렬 풀 워커에서 함수 실행
설명
은 함수 F
= parfeval(fcn
,numout
,X1,...,Xm
)fcn
이 실행되도록 예약합니다. MATLAB®은 사용 가능한 병렬 풀이 있으면 이를 사용하여 함수를 실행합니다. 그렇지 않으면 함수를 직렬로 실행합니다.
이 구문을 사용하는 병렬 코드를 Parallel Computing Toolbox™가 없는 MATLAB 사용자와 공유할 수 있습니다.
MATLAB은 m
개의 입력값과 n
개의 출력값을 사용하여 함수 fcn
을 비동기식으로 [Y1,...,Yn] = fcn(X1,...,Xm)
으로 실행합니다.
MATLAB은 함수 fcn
이 실행을 완료하기 전에 Future
객체 F
를 반환합니다. fetchOutputs
를 사용하여 Future에서 결과 [Y1,...,Yn]
을 가져올 수 있습니다. 함수 fcn
의 실행을 중지하려면 cancel
함수를 사용하십시오. Future에 대한 자세한 내용은 Future
항목을 참조하십시오.
병렬 풀이 열려 있는 경우 MATLAB은 이 병렬 풀을 사용하여 함수 fcn
을 실행합니다.
병렬 풀이 열려 있지 않은 경우 다음을 수행합니다.
자동 풀 생성이 활성화되어 있으면 MATLAB은 디폴트 클러스터 프로파일을 사용하여 병렬 풀을 시작한 다음, 이 병렬 풀을 사용하여 함수
fcn
을 실행합니다. 자동 풀 생성은 기본적으로 활성화되어 있습니다.parpool
을 풀 인수pool
로 지정하여 이 동작을 직접 강제 적용할 수 있습니다.자동 풀 생성이 비활성화되어 있으면 MATLAB은 지연 실행을 사용하여 함수
fcn
을 실행합니다.parallel.Pool.empty
를 풀 인수pool
로 지정하여 이 동작을 직접 강제 적용할 수 있습니다.
예제
parfeval
Future 쿼리 및 취소하기
parfeval
또는 parfevalOnAll
을 사용하여 백그라운드에서 계산을 실행하는 경우 Future라는 객체를 만듭니다. Future의 State
속성을 사용하여 Future가 실행 중인지, 대기 중인지 또는 완료되었는지 여부를 확인할 수 있습니다. 병렬 풀의 FevalQueue
속성을 사용하여 실행 중인 Future 및 대기 중인 Future에 액세스할 수도 있습니다. Future를 취소하려면 cancel
함수를 사용할 수 있습니다. 이 예제에서는 다음을 수행합니다.
cancel
을 사용하여 Future를 직접 취소합니다.완료된 Future에 대해 완료 오류가 있는지 검사합니다.
FevalQueue
속성을 사용하여 Future에 액세스합니다.
대기열에 작업 추가하기
두 개의 워커가 있는 병렬 풀 p
를 만듭니다.
p = parpool(2);
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to the parallel pool (number of workers: 2).
parfeval
을 사용하여 백그라운드에서 계산을 실행하는 경우, 이 함수는 각 계산에 대한 Future를 만들고 이를 풀 대기열에 추가합니다. 워커가 유휴 상태가 될 때까지 태스크는 대기열에 남아 있습니다. 워커가 유휴 상태가 되었을 때 대기열이 비어 있지 않으면 워커가 태스크를 계산하기 시작합니다. 워커가 태스크를 완료하면 태스크가 대기열에서 제거되고 워커는 유휴 상태가 됩니다.
parfeval
을 사용하여 워커에게 함수 pause
를 실행하도록 지시하여 Future f
로 구성된 배열을 만듭니다. 세 번째 Future에는 인수 1
을 사용하고, 나머지 모든 Future에는 인수 Inf
를 사용합니다.
for n = 1:5 if n == 3 f(n) = parfeval(@pause,0,1); else f(n) = parfeval(@pause,0,Inf); end end
사용되는 parfeval
각각은 워커에서 함수가 실행되는 것을 나타내는 Future 객체를 반환합니다. 세 번째 Future를 제외하면, 모든 Future를 계산하는 데에는 무한대의 시간이 걸릴 것입니다. parfeval(@pause,0,Inf)
로 생성된 Future는 대기열의 진행을 느리게 할 수 있는 Future의 극단적인 사례입니다.
직접 Future 취소하기
State
속성을 사용하여 Future의 상태를 가져올 수 있습니다. f
에 있는 각 Future의 상태로 구성된 셀형 배열을 만듭니다.
{f.State}
ans = 1×5 cell
{'running'} {'running'} {'queued'} {'queued'} {'queued'}
세 번째를 제외한 모든 태스크는 계속 일시 중지 상태입니다.
cancel
을 사용하여 두 번째 Future를 직접 취소합니다.
cancel(f(2)); {f.State}
ans = 1×5 cell
{'running'} {'finished'} {'running'} {'queued'} {'queued'}
두 번째 Future를 취소한 후에 세 번째 Future가 실행됩니다. 세 번째 Future가 완료될 때까지 기다린 후 상태를 다시 검사합니다.
wait(f(3)); {f.State}
ans = 1×5 cell
{'running'} {'finished'} {'finished'} {'running'} {'queued'}
이제 세 번째 Future의 상태가 'finished'
로 바뀌었습니다.
완료 오류 검사하기
Future가 완료되면 State
속성이 'finished'
로 바뀝니다. 취소된 Future와 정상적으로 완료된 Future를 구별하려면 Error
속성을 사용하십시오.
fprintf("f(2): %s\n", f(2).Error.message)
f(2): Execution of the future was cancelled.
fprintf("f(3): %s\n", f(3).Error.message)
f(3):
메시지 속성에 나타난 대로 이 코드는 두 번째 Future를 취소합니다. message
속성에 언급된 대로 두 번째 Future가 취소되었습니다. 세 번째 Future는 오류 없이 완료되므로 오류 메시지가 없습니다.
풀 대기열에 있는 Future 취소하기
FevalQueue
속성을 사용하여 풀 대기열에 있는 Future에 액세스할 수 있습니다.
p.FevalQueue
ans = FevalQueue with properties: Number Queued: 1 Number Running: 2
대기열은 두 속성 RunningFutures
및 QueuedFutures
를 갖습니다. RunningFutures
속성은 현재 실행 중인 태스크에 대응하는 Future로 구성된 배열입니다.
disp(p.FevalQueue.RunningFutures)
1x2 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------- 1 3 running @pause 2 6 running @pause
QueuedFutures
속성은 현재 대기 중이며 실행되고 있지 않은 태스크에 대응하는 Future로 구성된 배열입니다.
disp(p.FevalQueue.QueuedFutures)
FevalFuture with properties: ID: 7 Function: @pause CreateDateTime: 08-Mar-2021 10:03:13 StartDateTime: RunningDuration: 0 days 0h 0m 0s State: queued Error: none
하나의 Future만 취소하거나 Future로 구성된 배열을 취소할 수 있습니다. QueuedFutures
의 모든 Future를 취소합니다.
cancel(p.FevalQueue.QueuedFutures); {f.State}
ans = 1×5 cell
{'running'} {'finished'} {'finished'} {'running'} {'finished'}
f
가 최신순으로 정렬되어 있는지에 상관없이 RunningFutures
및 QueuedFutures
는 최신 항목부터 오래된 항목의 순서로 정렬됩니다. 각 Future는 클라이언트의 수명 동안 고유한 ID
속성을 가집니다. f
에 있는 각 Future의 ID
속성을 확인합니다.
disp(f)
1x5 FevalFuture array: ID State FinishDateTime Function Error -------------------------------------------------------------- 1 3 running @pause 2 4 finished (unread) 08-Mar-2021 10:03:20 @pause Error 3 5 finished (unread) 08-Mar-2021 10:03:21 @pause 4 6 running @pause 5 7 finished (unread) 08-Mar-2021 10:03:22 @pause Error
이 결과를 각 RunningFutures
의 ID
속성과 비교합니다.
for j = 1:length(p.FevalQueue.RunningFutures) rf = p.FevalQueue.RunningFutures(j); fprintf("p.FevalQueue.RunningFutures(%i): ID = %i\n", j, rf.ID) end
p.FevalQueue.RunningFutures(1): ID = 3 p.FevalQueue.RunningFutures(2): ID = 6
여기서, RunningFutures
는 f(1)
및 f(4)
를 포함하는 배열입니다. RunningFutures(2)
를 취소하면 네 번째 Future f(4)
가 취소됩니다.
작업 공간에서 Future를 사용할 수 없는 경우도 있습니다. 예를 들어, 작업이 완료되기 전에 동일한 코드 부분을 두 번 실행하거나, 함수에서 parfeval
을 사용하는 경우가 이에 해당합니다. 작업 공간에서 사용할 수 없는 Future를 취소할 수도 있습니다.
작업 공간에서 f
를 지웁니다.
clear f
RunningFutures
및 QueuedFutures
를 사용하여 아직 완료되지 않은 Future에 액세스할 수 있습니다. RunningFutures
를 사용하여 f(4)
를 취소합니다.
rf2 = p.FevalQueue.RunningFutures(2); cancel(rf2) rf2.State
ans = 'finished'
대기열에 남아 있는 모든 Future를 취소하려면 다음 코드를 사용하십시오.
cancel(p.FevalQueue.QueuedFutures); cancel(p.FevalQueue.RunningFutures);
비동기식으로 함수를 실행하고 출력값 가져오기
parfeval
을 사용하여 워커에서 비동기식 함수 실행을 요청할 수 있습니다.
예를 들어, 병렬 풀에 단일 요청을 제출해 보겠습니다. fetchOutputs
를 사용하여 출력값을 가져옵니다.
f = parfeval(@magic,1,10); value = fetchOutputs(f);
또한 for
루프 안에 여러 Future 요청으로 구성된 벡터를 제출하고 결과가 나오는 대로 수집할 수 있습니다. 효율성을 위해서 Future 객체로 구성된 배열을 미리 사전할당합니다.
f(1:10) = parallel.FevalFuture; for idx = 1:10 f(idx) = parfeval(@magic,1,idx); end
fetchNext
를 사용하여 개별 Future 출력값이 나오는 대로 가져옵니다.
magicResults = cell(1,10); for idx = 1:10 [completedIdx,value] = fetchNext(f); magicResults{completedIdx} = value; fprintf('Got result with index: %d.\n', completedIdx); end
parfeval
을 사용하여 파라미터 스윕 중에 플로팅하기
이 예제에서는 parfeval
을 사용하여 병렬 파라미터 스윕을 수행하고 DataQueue
객체를 사용하여 계산 중에 결과를 다시 보내는 방법을 보여줍니다.
parfeval
은 MATLAB을 차단하지 않으므로 계산이 수행되는 동안 계속해서 작업할 수 있습니다.
이 예제는 로렌츠 연립상미분방정식에서 파라미터 및 에 대한 파라미터 스윕을 수행하고 이 연립방정식의 혼돈적인 성질을 보여줍니다.
파라미터 그리드 만들기
파라미터 스윕에서 탐색할 파라미터의 범위를 정의합니다.
gridSize = 40; sigma = linspace(5, 45, gridSize); rho = linspace(50, 100, gridSize); beta = 8/3;
meshgrid
함수를 사용하여 파라미터의 2차원 그리드를 만듭니다.
[rho,sigma] = meshgrid(rho,sigma);
figure 객체를 만들고 'Visible'
을 true
로 설정하면 라이브 스크립트 밖의 새 창에서 열립니다. 파라미터 스윕의 결과를 시각화하려면 곡면 플롯을 만드십시오. NaN
을 사용하여 곡면의 Z
구성요소를 초기화하면 빈 플롯이 만들어집니다.
figure('Visible',true); surface = surf(rho,sigma,NaN(size(sigma))); xlabel('\rho','Interpreter','Tex') ylabel('\sigma','Interpreter','Tex')
병렬 환경 설정하기
parpool
함수를 사용하여 병렬 워커의 풀을 만듭니다.
parpool;
Starting parallel pool (parpool) using the 'Processes' profile ... Connected to the parallel pool (number of workers: 6).
워커에서 데이터를 보내려면 DataQueue
객체를 만드십시오. 워커가 afterEach
함수를 사용하여 데이터를 보낼 때마다 곡면 플롯을 업데이트하는 함수를 설정합니다. updatePlot
함수는 예제의 마지막 부분에 정의된 지원 함수입니다.
Q = parallel.pool.DataQueue; afterEach(Q,@(data) updatePlot(surface,data));
병렬 파라미터 스윕 수행하기
파라미터를 정의한 후 병렬 파라미터 스윕을 수행할 수 있습니다.
작업량을 분산하면 parfeval
은 더 효율적으로 작동합니다. 작업량을 분산하려면 탐색하고자 하는 파라미터를 파티션 단위로 그룹화하십시오. 이 예제에서는 콜론 연산자(:
)를 사용하여 균일한 크기(step
)의 파티션으로 분할합니다. 결과로 생성되는 배열 partitions
에는 파티션 경계가 담겨 있습니다. 이때 마지막 파티션의 끝점을 추가해야 함을 명심하십시오.
step = 100; partitions = [1:step:numel(sigma), numel(sigma)+1]
partitions = 1×17
1 101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 1601
최상의 성능을 구현하려면 다음과 같은 파티션 크기로 분할하십시오.
파티션을 나누는데 드는 오버헤드에 비해 계산 시간이 더 길 정도로 충분히 큰 크기.
모든 워커에서 계산을 수행할 수 있을 정도로 충분히 작은 크기.
병렬 워커에서 함수 실행을 표현하고 결과를 유지하려면 Future 객체를 사용하십시오.
f(1:numel(partitions)-1) = parallel.FevalFuture;
parfeval
함수를 사용하여 병렬 워커에 계산을 분담할 수 있습니다. parameterSweep
은 탐색할 파라미터의 파티션에 대해 로렌츠 연립방정식을 푸는 아래 스크립트의 마지막에 정의된 헬퍼 함수입니다. 출력 인수가 하나이므로 parfeval
에서 출력값 개수로 1
을 지정해야 합니다.
for ii = 1:numel(partitions)-1 f(ii) = parfeval(@parameterSweep,1,partitions(ii),partitions(ii+1),sigma,rho,beta,Q); end
parfeval
은 MATLAB을 차단하지 않으므로 계산이 수행되는 동안 계속해서 작업할 수 있습니다. 워커는 병렬로 계산하며 중간 결과가 나오는 대로 DataQueue
를 통해 전송합니다.
parfeval
이 완료될 때까지 MATLAB을 차단하려면 Future 객체에 wait
함수를 사용하십시오. wait
함수는 후속 코드가 parfeval
계산의 완료 여부에 종속되는 경우에 유용하게 사용할 수 있습니다.
wait(f);
parfeval
계산을 마치면 wait
가 완료된 후에 나머지 코드를 실행할 수 있습니다. 예를 들어, 결과 곡면의 등고선을 플로팅해 보겠습니다. fetchOutputs
함수를 사용하여 Future 객체에 저장된 결과를 가져오십시오.
results = reshape(fetchOutputs(f),gridSize,[]); contourf(rho,sigma,results) xlabel('\rho','Interpreter','Tex') ylabel('\sigma','Interpreter','Tex')
파라미터 스윕에 계산 리소스가 더 필요하고 클러스터에 액세스할 수 있는 경우 parfeval
계산을 확장할 수 있습니다. 자세한 내용은 Scale Up from Desktop to Cluster 항목을 참조하십시오.
헬퍼 함수 정의하기
탐색할 파라미터의 파티션에 대해 로렌츠 연립방정식을 푸는 헬퍼 함수를 정의합니다. DataQueue
객체의 send
함수를 사용하여 중간 결과를 MATLAB 클라이언트로 전송합니다.
function results = parameterSweep(first,last,sigma,rho,beta,Q) results = zeros(last-first,1); for ii = first:last-1 lorenzSystem = @(t,a) [sigma(ii)*(a(2) - a(1)); a(1)*(rho(ii) - a(3)) - a(2); a(1)*a(2) - beta*a(3)]; [t,a] = ode45(lorenzSystem,[0 100],[1 1 1]); result = a(end,3); send(Q,[ii,result]); results(ii-first+1) = result; end end
새 데이터가 도착하면 곡면 플롯을 업데이트하는 또다른 헬퍼 함수를 정의합니다.
function updatePlot(surface,data) surface.ZData(data(1)) = data(2); drawnow('limitrate'); end
afterEach
및 afterAll
을 사용하여 사용자 인터페이스를 비동기식으로 업데이트하기
이 예제에서는 계산이 완료될 때마다 사용자 인터페이스를 업데이트하는 방법을 보여줍니다. parfeval
을 사용하여 워커에 계산을 분담시키는 경우 워커가 이러한 계산을 수행하는 동안 모든 사용자 인터페이스가 즉각적으로 반응합니다. 이 예제에서는 waitbar
를 사용하여 간단한 사용자 인터페이스를 만듭니다.
각 계산이 완료된 후 사용자 인터페이스를 업데이트하려면
afterEach
를 사용합니다.모든 계산이 완료된 후 사용자 인터페이스를 업데이트하려면
afterAll
을 사용합니다.
waitbar
를 사용하여 Figure 핸들 h
를 만듭니다. afterEach
또는 afterAll
을 사용하면 waitbar
함수가 Figure 핸들을 업데이트합니다. 핸들 객체에 대한 자세한 내용은 핸들 객체 동작 항목을 참조하십시오.
h = waitbar(0,'Waiting...');
parfeval
을 사용하여 확률 행렬의 고유값에서 실수부를 계산합니다. 디폴트 기본 설정을 사용하면 병렬 풀이 아직 생성되지 않은 경우 parfeval
이 자동으로 병렬 풀을 만듭니다.
for idx = 1:100 f(idx) = parfeval(@(n) real(eig(randn(n))),1,5e2); end
afterEach
를 사용하면 parfeval
의 각 계산 결과마다 자동으로 함수를 호출할 수 있습니다. afterEach
를 사용하여 각 Future가 완료된 후 각 출력 배열에서 가장 큰 값을 계산합니다.
maxFuture = afterEach(f,@max,1);
State
속성을 사용하여 Future의 상태를 가져올 수 있습니다. f
에 있는 Future의 State
속성이 "finished"
인 논리형 배열을 만듭니다. mean
을 사용하여 완료된 Future의 소수 값을 계산합니다. 그 다음, 익명 함수 updateWaitbar
를 만듭니다. 이 함수는 h
의 대기 표시줄의 길이 소수 값을 완료된 Future의 소수 값으로 변경합니다.
updateWaitbar = @(~) waitbar(mean({f.State} == "finished"),h);
afterEach
및 updateWaitbar
를 사용하여 maxFuture
의 각 Future가 완료된 후 대기 표시줄의 길이 소수 값을 업데이트합니다. afterAll
및 delete
를 사용하여 모든 계산이 완료된 후 대기 표시줄을 닫습니다.
updateWaitbarFutures = afterEach(f,updateWaitbar,0); afterAll(updateWaitbarFutures,@(~) delete(h),0);
afterAll
및 histogram
을 사용하여 모든 Future가 완료된 후 maxFuture
의 결과를 히스토그램으로 표시합니다.
showsHistogramFuture = afterAll(maxFuture,@histogram,0);
입력 인수
fcn
— 실행할 함수
함수 핸들
워커에서 실행할 함수로, 함수 핸들로 지정됩니다.
예: fcn = @sum
데이터형: function_handle
numout
— 출력 인수 개수
음이 아닌 정수 스칼라
출력 인수 개수로, 음이 아닌 정수 스칼라로 지정됩니다.
n
은 fcn(X1,...,Xm)
을 실행한 결과 예상되는 출력 인수 개수입니다.
데이터형: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
X1,...,Xm
— 입력 인수
변수 또는 표현식이 쉼표로 구분된 목록
입력 인수로, 변수 또는 표현식이 쉼표로 구분된 목록으로 지정됩니다.
pool
— 풀
parallel.Pool
객체
풀로, parallel.Pool
객체로 지정됩니다.
병렬 풀을 만들려면
parpool
을 사용합니다.백그라운드 풀을 가져오려면
backgroundPool
을 사용합니다.
예: parpool('Processes');
예: backgroundPool;
출력 인수
F
— Future
parallel.FevalFuture
객체
확장 기능
자동 병렬 지원
Parallel Computing Toolbox™를 사용해 자동 병렬 계산을 실행하여 코드 실행 속도를 높일 수 있습니다.
사용법 관련 참고 및 제한 사항:
Parallel Computing Toolbox가 있는 경우 구문
parfeval(fcn,n,X1,...,Xm)
은 자동 병렬 연산을 지원합니다.
자세한 내용은 자동 병렬 연산을 지원하는 MATLAB 함수 실행하기 항목을 참조하십시오.
스레드 기반 환경
MATLAB®의 backgroundPool
을 사용해 백그라운드에서 코드를 실행하거나 Parallel Computing Toolbox™의 ThreadPool
을 사용해 코드 실행 속도를 높일 수 있습니다.
이 함수는 스레드 기반 환경을 완전히 지원합니다. 자세한 내용은 스레드 기반 환경에서 MATLAB 함수 실행하기 항목을 참조하십시오.
버전 내역
R2013b에 개발됨R2021b: 이제 풀 없이 직렬로 parfeval
실행 가능
R2021b부터는 풀 없이 직렬로 parfeval
을 실행할 수 있습니다. 따라서 이제 사용자가 작성한 병렬 코드를 Parallel Computing Toolbox가 없는 다른 사용자와 공유할 수 있습니다.
구문 parfeval(fcn,n,X1,...,Xm)
을 사용하는 경우, Parallel Computing Toolbox가 있으면 MATLAB은 열려 있는 병렬 풀을 사용하려고 시도합니다. 병렬 풀이 열려 있지 않은 경우 자동 풀 생성이 활성화되어 있으면 MATLAB이 병렬 풀을 만듭니다.
병렬 풀 생성이 비활성화되어 있거나 Parallel Computing Toolbox가 없으면 함수가 직렬로 실행됩니다. 이전 릴리스에서는 MATLAB에서 오류가 발생했습니다.
참고 항목
parfeval
| cancel
| ticBytes
| tocBytes
| afterEach
| afterAll
| fetchNext
| fetchOutputs
| parallel.pool.Constant
| parfevalOnAll
| parpool
| wait
| Future
MATLAB 명령
다음 MATLAB 명령에 해당하는 링크를 클릭했습니다.
명령을 실행하려면 MATLAB 명령 창에 입력하십시오. 웹 브라우저는 MATLAB 명령을 지원하지 않습니다.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)