Matlab의 병렬 계산의 parfor
부트 코드:
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 가동 병행 환경도 느리다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【MATLAB】변수를 스크립트에 저장MATLAB에서 계산 결과를 저장할 때 MAT 파일, Excel 등의 파일에 저장하는 것이 좋을 것이라고 생각하지만 변수의 유형에 따라 스크립트에 내보낼 수 있습니다. MATLAB을 사용해 10년 정도가 됩니다만, ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.