MATLAB Language
멀티 스레딩
수색…
parfor를 사용하여 루프를 병렬 처리하기
parfor
를 사용하여 루프의 반복을 병렬로 실행할 수 있습니다.
예:
poolobj = parpool(2); % Open a parallel pool with 2 workers
s = 0; % Performing some parallel Computations
parfor i=0:9
s = s + 1;
end
disp(s) % Outputs '10'
delete(poolobj); % Close the parallel pool
참고 : parfor
는 직접 중첩 될 수 없습니다. parfor
중첩을 위해서는 fisrt parfor
함수를 사용하고 그 함수에 두 번째 parfor
를 추가하십시오.
예:
parfor i = 1:n
[op] = fun_name(ip);
end
function [op] = fun_name(ip)
parfor j = 1:length(ip)
% Some Computation
end
parfor를 사용하는 경우
기본적으로, parfor
는 두 가지 경우에 권장됩니다 : 반복문 (즉, 1e10
과 같은)의 반복 횟수가 많거나 각 반복에 매우 긴 시간이 걸리는 경우 (예 : eig(magic(1e4))
). 두 번째 경우에는 spmd
사용하는 것이 spmd
. parfor
가 짧은 범위 또는 빠른 반복에 대한 for
루프보다 느린 이유는 계산을 수행하는 것과는 반대로 모든 작업자를 올바르게 관리하는 데 필요한 오버 헤드입니다.
또한 많은 함수에는 암시 적 멀티 스레딩이 내장되어 있으므로 모든 코어가 이미 사용되고 있으므로 serial for
루프보다 parfor
루프가 더 효율적이지 않습니다. parfor
는 실제로는 할당 오버 헤드가 있기 때문에이 경우에는 해가됩니다. 사용하려고하는 함수만큼 병렬 적입니다.
parfor
와는 대조적으로 for
의 동작을 보려면 다음 예제를 고려하십시오. 병렬 풀을 아직 열지 않았다면 먼저 엽니 다.
gcp; % Opens a parallel pool using your current settings
그런 다음 몇 가지 큰 루프를 실행합니다.
n = 1000; % Iteration number
EigenValues = cell(n,1); % Prepare to store the data
Time = zeros(n,1);
for ii = 1:n
tic
EigenValues{ii,1} = eig(magic(1e3)); % Might want to lower the magic if it takes too long
Time(ii,1) = toc; % Collect time after each iteration
end
figure; % Create a plot of results
plot(1:n,t)
title 'Time per iteration'
ylabel 'Time [s]'
xlabel 'Iteration number[-]';
다음과 같은 할 parfor
대신 for
. 반복 당 평균 시간이 증가한다는 것을 알 수 있습니다. 그러나 parfor
사용 가능한 모든 작업자를 사용 했으므로 총 시간 ( sum(Time)
)을 컴퓨터의 코어 수로 parfor
합니다.
따라서 for
를 사용 for
것과 관련하여 parfor
를 사용하여 각각의 반복을 수행하는 시간이 parfor
총 시간이 상당히 줄어 듭니다.
"단일 프로그램, 다중 데이터"(SPMD) 문을 사용하여 병렬로 명령 실행
루프의 반복을 가져 와서 여러 스레드로 분산시키는 병렬 for-loop ( parfor
)와는 달리 단일 프로그램, 다중 데이터 ( spmd
) 문은 일련의 명령을 spmd
모든 스레드에 분배하므로 각 스레드 스레드는 명령을 수행하고 결과를 저장합니다. 이걸 고려하세요:
poolobj = parpool(2); % open a parallel pool with two workers
spmd
q = rand(3); % each thread generates a unique 3x3 array of random numbers
end
q{1} % q is called like a cell vector
q{2} % the values stored in each thread may be accessed by their index
delete(poolobj) % if the pool is closed, then the data in q will no longer be accessible
스레드 색인 (lab 색인 또는 labindex
라고도 함)에 의해 spmd
블록에서 각 스레드에 액세스 할 수 있습니다.
poolobj = parpool(2); % open a parallel pool with two workers
spmd
q = rand(labindex + 1); % each thread generates a unique array of random numbers
end
size(q{1}) % the size of q{1} is 2x2
size(q{2}) % the size of q{2} is 3x3
delete(poolobj) % q is no longer accessible
두 예제 모두 q
는 q = Composite()
명령으로 초기화 할 수있는 복합 오브젝트 입니다. 풀이 실행되는 동안에 만 복합 개체에 액세스 할 수 있다는 점에 유의해야합니다.
배치 명령을 사용하여 다양한 계산을 병렬로 수행
MATLAB에서 멀티 스레딩을 사용하려면 batch
명령을 사용할 수 있습니다. Parallel Computing 도구 상자가 설치되어 있어야합니다.
시간이 많이 소요되는 스크립트의 경우, 예를 들어,
for ii=1:1e8
A(ii)=sin(ii*2*pi/1e8);
end
일괄 처리 모드로 실행하려면 다음을 사용합니다.
job=batch("da")
이는 MATLAB을 일괄 처리 모드로 실행할 수있게 해주 며 그 동안 MATLAB을 사용하여 배치 프로세스를 추가하는 것과 같은 다른 작업을 수행 할 수있게합니다.
작업을 완료하고 배열 A
를 작업 공간에로드 한 후 결과를 검색하려면 :
load(job, 'A')
마지막으로 홈 → 환경 → 병렬 → 모니터 작업 에서 "모니터 작업 GUI"를 열고 다음을 통해 작업을 삭제하십시오.
delete(job)
일괄 처리를위한 함수를로드하려면 fcn
이 함수 이름이고, N
은 출력 배열의 수이고 x1
, ...
, xn
은 입력 배열입니다.
j=batch(fcn, N, {x1, x2, ..., xn})