Matlab의 병렬 계산의 parfor

3175 단어 matlab병렬 계산
matlab의 계산량이 매우 크고 독립된 순환 계산이 많이 반복될 때 우리는 matlab의 병렬 계산을 사용할 수 있다. 여기서 나는 먼저 PARfor 병렬 계산을 시험했다.다음 코드는 새 버전의 matlab에만 적합하며, 에서 개편되었다.
부트 코드:
function [pool] = startmatlabpool(size)
pool=[];
isstart = 0;
if isempty(gcp('nocreate'))==1
    isstart = 1;
end
if isstart==1
    if nargin==0
        pool=parpool('local');
    else
        try
            pool=parpool('local',size);%matlabpool('open','local',size);
        catch ce
            pool=parpool('local');%matlabpool('open','local');
            size = pool.NumWorkers;
            display(ce.message);
            display(strcat('restart. wrong  size=',num2str(size)));
        end
    end
else
    display('matlabpool has started');
    if nargin==1
        closematlabpool;
        startmatlabpool(size);
    else
        startmatlabpool();
    end
end

코드를 닫으려면 다음과 같이 하십시오.
function [] = closematlabpool
if isempty(gcp('nocreate'))==0
    delete(gcp('nocreate'));
end

테스트 코드:
pool = startmatlabpool(4);
N=1000;
M=100;
data = cell(1,N);
for kk = 1:N
   data{kk} = rand(M);
end
display(strcat('datasize:',num2str(N*M*M/1024/1024),'M doubles'));
tic;
parfor ii = 1:N
     c1(:,ii) = eig(data{ii});
end
t1 = toc; 
display(strcat('parafor:',num2str(t1),'seconds'));
 
tic;
for ii = 1:N
     c2(:,ii) = eig(data{ii});
end
t2 = toc; 
display(strcat('for:',num2str(t2),'seconds'));
 
closematlabpool;

결과: Datasize: 9.5367M Doubles
parafor:1.6411seconds
for:3.908seconds
Parallel pool using the 'local' profile is shutting down.
파라포스의 계산 속도가 절반 빠르다는 것을 알 수 있다.
 
문답1: 각 라인의 데이터를 총괄할 수 있습니까?
오픈 MP에서도 이 문답이 있다.
for i = 1 : 1000
sum = sum + i;
end
 
만약 병행된다면 모든 A가 라인에서 자신의 복사본을 가지고 있다면 마지막에 얻은 A는 예측할 수 없는 것이다.
openMP의 해결 방법은 Reduction 자구를 추가하는 것입니다.
#pragma omp parallel for reduction(+: sum)
for ( i = 1; i < 1001; i++ )
{
        sum += i;
}
이렇게 sum는 1-1000의 합이다.
matlab에서 matlab 자체는sum의 덧셈을 Reduction 덧셈으로 기본적으로 설정하는데 간략/규약 조작이라고 하는데 어차피 이 조작을 하지 않으면 다른 의미가 없다.ORZ 코드:
startmatlabpool(4)
sum = 0;
parfor i = 1:1000
    sum = sum + i;
end
sum
closematlabpool;

결과:sum=500500
사실상 연속적인 조작을 할 수 있는 조작부호는 모두 간략한 조작을 지원한다. 예를 들어 *,.*,+,-,&,|,[,expr] 등등.
그러나 간략한 조작에는 함정이 많기 때문에 병행 조작을 간소화하고 일치성을 높이는 것이 필요하다.
 
문답2:parfor의 변수는 어떤 주의가 있습니까?
사실 별로 신경 쓰지 않아요. OpenMP보다 PARfor가 훨씬 간단해요. 쓰기에는 어렵지만 간단하게 병행 조작하기 편해요.모든 변수를 직접 사용하면 됩니다. 책의 각종 변수 종류는 모두 사람을 위협하지만 간략하지 않은 조작 상황에서 답이 정확한지 여부와 입력 변수를 함부로 수정하지 마십시오(수정 후의 결과는 예측할 수 없습니다).
 
문답3:parfor 문장 작용역은break을 사용할 수 있습니까?
답은 안돼.이것은 특정 상황에서 직접 퇴출할 수 없다. 즉, 실행되면 실행해야 한다는 것이다.또한parfor는 가장 낮은 병렬 문장으로 작용역 내부에서도 spmd,parfor를 사용할 수 없지만 parfor를 포함하는 함수를 사용할 수 있습니다.
 
Q&A 4: Parfor 사용 시기
사실 사용해 보니 그의 역할이 크지 않고 각종 병행 제어 수단이 없다는 것을 느꼈다. 만약에 데이터량이 너무 많고 각 순환역 간에 상대적으로 독립된다면 PARfor를 사용할 수 있다.또한 matlab 가동 병행 환경도 느리다.

좋은 웹페이지 즐겨찾기