2012-01-23 8 views
4

단일 CPU 계산과 병렬 계산을 계산 시간과 비교해야하는 다음 짧은 스크립트에서 문제를 파악할 수 없습니다. 전체 이미지에MATLAB에서 병렬화 관련 문제

parfor 링크 : LINK

코드는이 :

n = 700; 
ranksSingle = zeros(1,n); 
tic 
for ind = 1:n 
    ranksSingle(ind) = rank(magic(ind)); 
end 
toc 

matlabpool local 4 
tic 
ranks = zeros(1,n); 
parfor (ind = 1:n) 
    ranks(ind) = rank(magic(ind)); 
end 
toc 
isequal(ranksSingle, ranks) 
matlabpool close 

또한 matlabpool 2 그것을 시도했다. 프로세스 창에서 분명히 알 수 있듯이 병렬 계산 (빨간색으로 표시)을 실행하면 모든 코어가 100 % 사용 중입니다.

단일 CPU 계산 (파란색으로 표시)을 실행하면 이상하게도 4 코어가 이전보다 사용량이 많습니다. 나는 하나의 코어 만 올라갈 것으로 기대했을 것이다. 아마도 magic()이나 rank 함수가 내장되어 있고, 여기에서 읽을 수 있듯이 인터넷을 검색했습니다 : http://www.walkingrandomly.com/?p=1894 그렇지 않습니다. 그래서 4 개의 코어가 완전히 바쁘지는 않지만, 여전히 모든 코어가 왜 올라가는지 궁금합니다.

둘째, 병렬화 된 버전의 계산 시간이 정말 궁금합니다. 싱글 코어에 작업을 분산시킴으로써 오버 헤드가 발생한다는 것을 알지만, 결국 그렇게 많은 정보가 없어야합니다. (

아마도 누구나 그것에 대해 뭔가를 말할 수 있습니다. 두 번째 질문은 컴퓨터에있는 물리적 코어 수에 항상 작업자 크기를 설정하라는 명령이 있다면 (또한 Hyper (하이퍼 링크)를 사용하는 것입니다. 즉, 추가 혜택의 경우 스레딩?) ​​

감사합니다 많이!

답변

5

을 병렬 작업을 실행하려는 경우, 당신은 너무 많은 빠른 반복을 가지고 나쁜, 그리고 너무 몇 가지 가지고 나쁜 것을 기억해야한다 느린 반복 . 백만 회 반복을 수행 할 때마다 수 밀리 초가 걸리면 병렬 처리로 인한 오버 헤드로 인해 가능한 모든 이득이 파괴됩니다. 9 회의 반복 작업을 각각 1 시간 씩 수행하고 병렬로 8 개의 프로세서에서 실행하면 7 개의 프로세서가 반복 9 번이 끝날 때까지 대기합니다.

예를 들어, magicrank이 너무 빠르기 때문에 예제가 병렬화의 영향을 테스트하는 데 상당히 나쁩니다. 오버 헤드 (나는 matlabpool에 의해 사용 된 시간을 계산하지 않았다는 것을주의의 비트가 있습니다 : 나는 동시에 두 번째 병렬 작업을 실행했지만, 대략, 결과가 재현해야

function testParfor2 
    tic 
    for i=1:4 
     pause(1); %# wait for 1 second 
    end 
    toc 
    matlabpool open 4 
    tic 
    parfor i=1:4 
     pause(1); %# wait for 1 second 
    end 
    toc 

Elapsed time is 4.050287 seconds. 
Elapsed time is 1.534534 seconds. 

주의!),하지만 속도가 빨라집니다. 일시 정지 길이를 늘리면 같은 양의 오버 헤드가 표시되어야합니다. 또한 실제 루프로 테스트해야합니다 (가장 바깥 쪽 루프를 병렬화하려고합니다, btw). 두 번째 질문에 대한

:

matlabpool open 

물리적 코어와 같은 수 많은 노동자를 작성합니다. 하이퍼 스레딩은 병렬 작업이 실행 중일 때 컴퓨터가 응답을 유지할 수 있도록 도와줍니다.

마지막으로 magicrank은 완전히 다중 스레드되지 않을 수 있지만 다중 스레드 루틴을 호출 할 수 있습니다.

+2

수정.예를 들어'rank'는 다중 스레드 된'svd'를 사용합니다. –

+0

감사합니다. 내일 좀 더 값 비싼 작업을 시도해 보겠습니다. :) – tim

+0

@Jonas :'matlabpool open'은 저에게 "로컬 설정을 사용하여 matlabpool을 시작합니다 ... 2 개의 실험실에 연결되었습니다."라고합니다. 위의 스크린 샷에서 분명히 볼 수 있듯이 4 코어가 있으므로 예상 결과가 아닙니다. 편집 : 어떻게 든'matlabpool (4)'를 시작할 수 없습니다. 최소 4 명의 작업자를 요청했지만 스케줄러의 ClusterSize 속성은 현재 최대 2 명의 작업자를 허용하도록 설정되었습니다. 이보다 더 많은 작업자에 대해 병렬 작업을 실행하려면 구성 관리자 [...]를 사용하여 '로컬'구성에서 ClusterSize 속성 설정을 늘리십시오. – tim