수색…


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

두 예제 모두 qq = 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})


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow