2012-08-09 6 views
17

Chcę móc programować wiele wątków z oktawą gnu, aby wykorzystywał wiele procesorów.Uzyskaj Octave GNU do pracy z procesorem wielordzeniowym. (Wielowątkowość)

zainstalowałem GNU Octave na Fedora Linux 17 i zrobił, co następuje:

yum install octave 

które zainstalowane na komputerze najnowszą wersję oktawy, 3.6.2. Działa wspaniale, jednak gdy pomnożysz dwie ogromne matryce razem, przesuwa się o jeden procesor, którego używa oktawa. Byłoby miło, gdyby mnożenie macierzy wykorzystywało wszystkie rdzenie, ponieważ w tym przypadku procesor jest oczywiście wąskim gardłem.

Czy oktawa w pełni wykorzystuje procesory wielordzeniowe i działa na wielu wątkach? Czy jest tam flaga lub flaga kompilacji?

+0

Podobny do odpowiedzi Erika, możesz skompilować Octave z bibliotekami Intel'a dla jądra matematyki, aby móc korzystać z wielu wątków. MKL jest darmowy do użytku niekomercyjnego. http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – KevinC

Odpowiedz

24

Rozwiązanie

sam oktawy jest zastosowanie pojedynczej nici, który działa na jeden rdzeń. Możesz uzyskać oktawę, używając bibliotek takich jak ATLAS, które wykorzystują wiele rdzeni. Tak więc, podczas gdy Octave używa tylko jednego rdzenia, gdy napotkasz ciężką operację, funkcje oktawy działają w ATLAS, które wykorzystują wiele procesorów.

Udało mi się to zrobić. Najpierw skompiluj "ATLAS" z kodu źródłowego i udostępnij go systemowi, aby oktawa mogła go znaleźć i korzystać z tych funkcji bibliotecznych. ATLAS dopasowuje się do twojego systemu i liczby rdzeni. Kiedy instalujesz oktawę ze źródła i określasz ATLAS, to używa go, więc kiedy oktawa wykonuje ciężką operację, jak ogromne mnożenie macierzy, ATLAS decyduje o tym, ile cpu ma użyć.

Nie udało mi się uruchomić tego dla Fedory, ale w Gentoo mogłem go uruchomić.

Kiedyś te dwa linki: ftp://ftp.gnu.org/gnu/octave/

http://math-atlas.sourceforge.net/

Pobiegłem następujące rdzeń oktaw przed i po ATLAS zainstalować:

tic 
bigMatrixA = rand(3000000,80); 
bigMatrixB = rand(80,30); 
bigMatrixC = bigMatrixA * bigMatrixB; 
toc 
disp("done"); 

Mnożenie macierzy idzie znacznie szybciej za pomocą wiele procesorów, które były 3 razy szybsze niż wcześniej z pojedynczym rdzeniem:

Without Atlas: Elapsed time is 3.22819 seconds. 
With Atlas: Elapsed time is 0.529 seconds. 

Trzy biblioteki używam których prędkość rzeczy są blas-atlas, cblas-atlas, lapack-atlas.

Jeśli oktawa może korzystać z nich zamiast domyślnych bibliotek, a także bibliotek z bibliotekami, będzie korzystać z wielu rdzeni.

Nie jest to łatwe i wymaga umiejętności programowania, aby uzyskać oktawę do kompilacji ze źródła za pomocą ATLAS.

Drabacks użyciem Atlas:

To oprogramowanie Atlas używa dużo napowietrznych podzielić swój program oktaw w wielu wątkach. Pewnie, że idzie o wiele szybciej, jeśli wszystko, co robisz, to wielkie multiplikacje macierzy, ale większość poleceń nie może być wielowątkowa przez atlas.Jeśli wydobycie każdej mocy obliczeniowej/prędkości z rdzeni jest najwyższym priorytetem, będziesz miał dużo więcej szczęścia, pisząc program, który będzie działał równolegle z samym sobą. (Podziel swój program na 8 programów równorzędnych, które działają na 1/8 problemu i uruchom je wszystkie jednocześnie, gdy wszystko będzie gotowe, ponownie połącz wyniki).

Atlas pomaga programowi z pojedynczą gwintowaną oktawą zachowywać się nieco bardziej jak wielowątkowa aplikacja, ale nie jest to srebrna kula. Atlas nie sprawi, że twój pojedynczy program ośmiordzeniowy maksymalnie wyda twój 2,4,6,8 rdzeniowy procesor. Zauważysz wzrost wydajności, ale przyspieszenie pozwoli ci znaleźć lepszy sposób wykorzystania całego procesora. Odpowiedzią jest napisanie programu, który będzie działał równolegle z samym sobą, a to wymaga umiejętności programowania.

Sugestia

Wskaż swoją energię w Wektoryzacja swoje najcięższe operacje i dystrybucji proces nad n jednoczesnych wątków uruchomiony. Jeśli czekasz zbyt długo na proces, najprawdopodobniej najniższy zwisający owoc, aby go przyspieszyć, to użycie bardziej wydajnego algorytmu lub struktury danych.

+0

W przypadku podejścia "podziel swój program na osobne wątki" optymalny BLAS jest nadal pożądany, ale * pojedynczy gwintowane *. Podobnie jak w tej sekcji [openBLAS] (http://wiki.octave.org/Octave_and_separate_toolchain). Następnie zobacz przykłady w http://wiki.octave.org/Parallel_package – ederag

6

Na Octave-Forge dwa pakiety zajmujące równoległego:

Jest również możliwe, aby zduplikować podprocesów za pomocą funkcji fork().

2

Zgodnie z sugestią Eric, spróbowałem użyć ATLAS i poprawiło to moją wydajność 3x (w aplikacji do nauki NN, głównym kosztem jest mnożenie macierzy). Niespodziewanie wydawało się, że wciąż używa tylko jednego rdzenia. Po dalszych badaniach natknąłem się na OpenBLAS i zaczęto używać wielu rdzeni po wyjęciu z pudełka i jeszcze bardziej poprawiłem wydajność 2 razy (miałem tylko 2 rdzenie). Jeśli chcesz wycisnąć więcej, możesz także spróbować użyć MKL, ale jest on ciężki na dysku z powodu zależności.

używałem Arch Linux z pakietami społeczności/atlas-lapack-base i aur/openblas-lapack. Instalowanie każdej z nich zmieniło domyślną używaną w Octave.

Oto dobry benchmark porównujący te biblioteki: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/