2013-02-20 14 views
6

Mam Matlab R2012b dla 64 bitów Ubuntu. Mam procesor Intel Core i3 M 330 @ 2.13 GHz × 4.Równoległe 4 działa z PARFOR z Core i3 w Matlab

Chcę użyć parfor, aby równolegle 4 pętle w tym samym czasie. Ponieważ Intel Core i3 ma 2 rdzenie i 4 wątki używam tego kodu:

if matlabpool('size') == 0 % checking to see if my pool is already open 
    matlabpool(4) 
else 
    matlabpool close 
    matlabpool(4) 
end 

I uzyskać następujący błąd:

Błąd:

You requested a minimum of 4 workers, but the cluster "local" has the NumWorkers property set to allow a maximum of 2 workers. To run a communicating job on more workers than this (up to a maximum of 12 for the Local cluster), increase the value of the NumWorkers property for the cluster. The default value of NumWorkers for a Local cluster is the number of cores on the local machine.

Dlaczego? Domyślna wartość NumWorkers w moim komputerze to 2, ale jeśli mogę zrobić 4 pętle w tym samym czasie, w jaki sposób mogę je uzyskać?

Odpowiedz

8

Aby zwiększyć domyślną NumWorkers, otwórz Menedżera profili klastra (Równoległe-> Zarządzaj profilami klastra). Wybierz profil local, kliknij edytuj i zwiększ wartość NumWorkers do maksymalnej możliwej wartości (w twoim przypadku 4). Teraz możliwe jest utworzenie urządzenia matlabpool z większą liczbą robotników niż fizyczne rdzenie.

Należy jednak zauważyć, że użycie większej liczby pracowników niż rdzeni może spowodować obniżenie wydajności w porównaniu do posiadania takiej samej liczby pracowników co rdzenie.

+0

Tak, to jest rzeczywiście poprawna. +1 – Jonas

+0

Dwa pytania: dlaczego więcej pracowników niż rdzeni obniżyło wydajność? Jak mogę poznać domyślną wartość NumWorkers dla klastra lokalnego? –

+2

Domyślną wartością jest liczba rdzeni fizycznych (jest to nawet podane w komunikacie o błędzie podanym w pytaniu). Więcej pracowników niż rdzeni * może * obniżyć wydajność, ponieważ nie działają one na fizycznie oddzielonych rdzeniach, tzn. Mogą wpływać na siebie nawzajem. –

8

programowo zmienić wartość NumWorkers od 2 do 4 profilu local klastra, można use:

myCluster = parcluster('local'); 
myCluster.NumWorkers = 4; % 'Modified' property now TRUE 
saveProfile(myCluster); % 'local' profile now updated, 
          % 'Modified' property now FALSE