2012-08-09 9 views
17

Ich möchte mehrere Threads mit gnu Oktave programmieren können, so dass es mehrere Prozessoren verwenden wird.Get GNU Octave für die Arbeit mit einem Multicore-Prozessor. (Multithreading)

Ich installierte GNU Octave auf Fedora 17 Linux und hat die folgenden:

yum install octave 

, die auf meinem Computer die neueste Version von Oktave installiert ist, 3.6.2. Es funktioniert gut, aber wenn du zwei große Matrizen multiplizierst, wird die eine CPU, die die Oktave benutzt, benutzt. Es wäre schön, wenn die Matrixmultiplikation alle Kerne verwendet, da in diesem Fall die CPU offensichtlich der Flaschenhals ist.

Kann Octave vollständig Multi-Core-Prozessoren nutzen und auf mehreren Threads laufen? Gibt es dafür eine Bibliothek oder Kompilierzeitflagge?

+0

Ähnlich Eric Antwort, können Sie Octave mit Intels Math Kernel-Bibliotheken kompilieren, damit es mehrere Threads verwenden. Das MKL ist kostenlos für nicht-kommerzielle Nutzung. http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – KevinC

Antwort

24

Lösung

Octave selbst ist eine Single-Thread-Anwendung, die auf einem Kern läuft. Sie können Oktaven verwenden, um einige Bibliotheken wie ATLAS zu verwenden, die mehrere Kerne verwenden. Während Octave nur einen Kern verwendet, ruft Octave bei einer schweren Operation Funktionen in ATLAS auf, die viele CPUs verwenden.

Ich konnte dies tun. Kompilieren Sie zunächst 'ATLAS' aus dem Quellcode und stellen Sie es Ihrem System zur Verfügung, damit Octave es finden und diese Bibliotheksfunktionen verwenden kann. ATLAS stellt sich auf Ihr System und die Anzahl der Kerne ein. Wenn Sie eine Oktave von der Quelle installieren und ATLAS angeben, wird sie verwendet. Wenn also die Oktave eine schwere Operation wie eine große Matrixmultiplikation ausführt, entscheidet ATLAS, wie viele CPUs zu verwenden sind.

Ich konnte dies nicht für Fedora, aber auf Gentoo konnte ich es zur Arbeit bringen.

habe ich diese beiden Links: ftp://ftp.gnu.org/gnu/octave/

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

ich folgende Oktave Kern vor und nach dem ATLAS lief installieren:

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

Die Multiplikation Matrix geht viel schneller mit mehrere Prozessoren, die war dreimal schneller als zuvor mit Single-Core:

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

Die drei Bibliotheken, die ich welcher Geschwindigkeit die Dinge bin mit sind blas-atlas, cblas-atlas, lapack-atlas.

Wenn octave diese anstelle der Standard-Blas- und lapack-Bibliotheken verwenden kann, verwendet es Multi-Core.

Es ist nicht einfach und erfordert einige Programmierkenntnisse, um die Oktave aus der Quelle mit ATLAS zu kompilieren.

Drabacks zu Atlas mit:

Dieser Atlas Software eine Menge Overhead verwendet Ihre Oktave Programm in mehrere Threads aufgeteilt. Sicher, es geht viel schneller, wenn Sie nur riesige Matrix-Multiplikationen machen, aber die meisten Befehle können nicht durch Atlas multi-threaded sein.Wenn es oberste Priorität hat, jedes Bit Prozessorleistung/Geschwindigkeit aus Ihren Kernen zu extrahieren, dann haben Sie viel mehr Glück, wenn Sie Ihr Programm schreiben, damit es parallel zu sich läuft. (Teilen Sie Ihr Programm in 8 gleichwertige Programme auf, die an 1/8 des Problems arbeiten und führen Sie alle gleichzeitig aus, wenn alle fertig sind, setzen Sie die Ergebnisse wieder zusammen).

Atlas hilft einem eintönigen Oktavprogramm, sich ein wenig mehr wie eine Multithread-App zu verhalten, aber es ist keine Wunderwaffe. Atlas wird Ihr Single-Threaded-Octave-Programm nicht aus Ihrem 2,4,6,8-Core-Prozessor machen. Sie werden eine Leistungssteigerung bemerken, aber der Boost wird Sie auf der Suche nach einer besseren Möglichkeit zur Verwendung des gesamten Prozessors verlassen. Die Antwort ist, dass Sie Ihr Programm so schreiben, dass es parallel zu sich selbst läuft, und das erfordert eine Menge Programmierkenntnisse.

Anregung

Setzen Sie Ihre Energie in Ihren schwersten Operationen Vektorisierung und den Prozess über n gleichzeitige laufende Threads verteilen. Wenn Sie zu lange darauf warten, dass ein Prozess ausgeführt wird, verwenden Sie wahrscheinlich einen effizienteren Algorithmus oder eine effizientere Datenstruktur.

+0

Für die "Split Ihr Programm in separaten Threads" Ansatz ist eine optimierte BLAS immer noch wünschenswert, aber * single Gewinde *. Wie in diesem [openBLAS-Abschnitt] (http://wiki.octave.org/Octave_and_separate_toolchain). Dann sehen Sie Beispiele in http://wiki.octave.org/Parallel_package – ederag

6

Auf Octave-Forge sind zwei Pakete mit parallel Softwareparallelisierung:

Es ist auch möglich, Teilprozesse mit der fork() Funktion zum Laichen.

2

Wie von Eric vorgeschlagen versuchte ich ATLAS und es verbesserte meine Leistung 3x (in NN lernen Anwendung, die Hauptkosten sind Matrix-Multiplikation). Überraschenderweise schien es immer noch nur einen Kern zu verwenden. Nach weiteren Recherchen stolperte ich über OpenBLAS und es begann mehrere Kerne aus der Box zu verwenden und verbesserte die Leistung weitere 2 mal (ich hatte nur 2 Kerne obwohl). Wenn Sie mehr ausdrücken möchten, können Sie auch versuchen, MKL verwenden, aber es ist aufgrund der Abhängigkeiten auf dem Speicherplatz schwer.

Ich benutzte Arch Linux mit den Paketen community/atlas-lapack-base und aur/openblas-lapack. Die Installation von jedem von ihnen wechselte den Standard, der in Octave verwendet wurde.

Hier ist ein schöner Benchmark zum Vergleichen dieser Bibliotheken: http://www.tcm.phy.cam.ac.uk/~mjr/linpack/