2011-08-03 16 views
5

Mam to wiele setek komórek Mathematica i chcę korzystać z równoległej oceny. Mam 2 procesory x 4 rdzenie dla każdej maszyny z pamięcią 16 Gb. Licencja My Mathematica pozwala mi na uruchamianie co najwyżej 2 główne jądra z 1 masterem może mieć 4 jądra slave (to jest moja interpretacja po tym, jak bawiłem się z nią przez jakiś czas).Ocena komórek równolegle w Mathematica

Zwykłem uruchamiać mój kod w dwóch głównych jądrach w dwóch różnych notatnikach. Aby jeszcze bardziej przyspieszyć, próbowałem zamknąć kilka komórek za pomocą ParallelEvaluate[] i wydawało się, że działa. Następnie mam również 4 kopie mojego kodu, nieświadome siebie nawzajem za pośrednictwem jednego z głównych jąder, co jest w porządku. (Zasadniczo próbuję uruchomić tak wiele kopii mojego kodu/mathkernela równolegle, jak to tylko możliwe.Nie strzelam do niczego prawdziwie równoległego).

Ponieważ mój kod jest zbyt długi i skomplikowany, nie chcę ponownie edytować każdej komórki, aby umożliwić jej równoległą ocenę. Czy jest coś magicznego, co mogę umieścić na początku mojego notatnika, więc każda komórka oceniana później będzie domyślnie ParallelEvaluate[ ... cell contents.... ]?

+1

Czy jesteś pewien, że chcesz na 'ParallelEvaluate []' wszystkie komórki? Czy eksperymentowałeś już z tym na swoim kodzie? Podpowiedź: Prawdopodobnie dostaniesz listy, na których otrzymujesz teraz jeden wynik ... –

+0

Tak Otrzymuję listy tabel i to jest w porządku. Będę ręcznie łączyć te tabele w głównym jądrze i analizować wyniki. Po prostu próbuję znaleźć najłatwiejszy sposób użycia wszystkich mathkerneli do przyspieszenia obliczeń. – Hsn

+0

Próbowałem eksperymentować z $ Pre = ParallelEvaluate ;, ale nie mogę teraz używać Mmy (problemy sprzętowe), może chcesz spróbować. –

Odpowiedz

2

Zgodnie z sugestią belizariusza, Pre = ParallelEvaluate robi dokładnie to, co chcę. Jeden problem polegał na tym, że robię $ Pre = Identity, aby go wyłączyć, abym mógł wrócić do mojego głównego jądra, matematyka wciąż próbuje ocenić to w jądrze niewolnika zamiast nadrzędnego i kończy się niepowodzeniem. W końcu rozwiązałem to w następujący sposób: SetSharedVariable [parallelcontrol]; parallelcontrol = ParallelEvaluate; $ Pre: = parallelcontrol; ... wszystko jest oceniane w niewolnikach tutaj ...; parallelcontrol = Tożsamość; .... wszystko wrócić do być oceniane tylko na pana ... Oto przykładowy bieg na moim laptopie, który ma 2 rdzenie:

LaunchKernels[] 

{KernelObject [1, "lokalny"], KernelObject [2, "lokalny"]}

$KernelID 
ParallelEvaluate[$KernelID] 

{1, 2}

SetSharedVariable[parcontrol]; $Pre := parcontrol; parcontrol = ParallelEvaluate 

zerowa [ParallelEvaluate]

$KernelID 

{1, 2}

parcontrol = Identity 

{Tożsamość Identity}

$KernelID 
parcontrol = ParallelEvaluate 

ParallelEvaluate

$KernelID 

{1, 2}