Frage

Ich habe viele netten MATLAB-Code, der zu langsam läuft und würde ein Schmerz zu schreiben über in C. Der MATLAB Compiler für C sein scheint nicht viel zu helfen, wenn überhaupt. Sollte es mehr Ausführung wird die Beschleunigung? Bin ich geschraubt?

War es hilfreich?

Lösung

Ich werde wiederholen, was dwj sagte: Wenn Ihr MATLAB-Code langsam ist, ist dies wahrscheinlich, weil es nicht ausreichend vektorisiert ist. Wenn Sie explizite Schleifen tun, wenn Sie Operationen auf ganze Arrays werden könnten tun, das ist der Schuldige.

Dies gilt gleichermaßen für alle Array-orientierte dynamischen Sprachen: Perl Data Language, Numeric Python, MATLAB / Octave, etc. Es zu einem gewissen Grad auch wahr ist in kompilierten C und Fortran-kompilierten Code: speziell entwickelten Vektorisierung Bibliotheken verwenden in der Regel sorgfältig Hand -codierte innere Schleifen und SIMD-Befehle (zB MMX, SSE, AltiVec).

Andere Tipps

Wenn Sie die MATLAB complier (auf eine aktuelle Version von MATLAB) Sie dann sieht an Sicherheit grenzender Wahrscheinlichkeit wird keine speedups überhaupt. Dies liegt daran, alle die Compiler tatsächlich sind Ihnen nicht gibt einen Weg, um Ihren Code der Verpackung, so dass es den Menschen verteilt werden kann, die MATLAB nicht haben. Es konvertiert nicht es etwas schneller (wie Maschinencode oder C.) - es nur in C-Wraps, so dass Sie es so nennen kann

Es tut dies, indem Sie den Code immer auf dem MATLAB Compiler Runtime (MCR), die im Wesentlichen die MATLAB Computational Kernel laufen - Code noch interpretiert wird. Dank der Strafe entstehen, indem der MCR Sie können feststellen, dass kompilierte Code läuft langsamer als berufen, wenn Sie einfach lief es auf MATLAB.

Um es anders auszudrücken - könnte man sagen, dass der Compiler kompiliert nicht wirklich -. Im herkömmlichen Sinne des Wortes zumindest

Ältere Versionen des Compilers arbeitete anders und Beschleunigungen in bestimmten Situationen auftreten können. Für Mathwork nehmen auf diese gehen

http://www.mathworks.com/support/solutions/ data / 1-1ARNS.html

Nach meiner Erfahrung langsam MATLAB-Code kommt in der Regel aus nicht Ihrem Code Vektorisierung (das heißt, das Schreiben für Schleifen statt nur Multiplikation Arrays (einfaches Beispiel)).

Wenn Sie Datei tun I / O halten Sie Ausschau nach Daten in einem Stück zu einem Zeitpunkt, zu lesen. Schauen Sie in den Hilfedateien für die vektorisierte Version von fscanf.

Vergessen Sie nicht, dass MATLAB einen Profiler beinhaltet auch!

Zuerst habe ich zweite alle oben Kommentare über Profilierung und Vektorisierung.

Für eine historische Perspektive ...

ältere Version von Matlab erlaubte der Benutzer Funktion m-Dateien zu konvertieren, um mex durch den m-Code vorge Parsen und es zu einem Satz von Matlab-Bibliothek Anrufen zu konvertieren. Diese Anrufe haben alle die Fehler überprüfen, ob der Dolmetscher hat, aber alte Versionen des Interpreters und / oder Online-Parser waren langsam, so dass die m-Datei kompilieren würde manchmal helfen. Normalerweise half es, wenn Sie Loops hatte, weil Matlab klug genug war einige, dass in C. Inline Wenn Sie eine dieser Versionen von Matlab haben, können Sie versuchen, das mex Skript erzählt die C-Datei zu speichern und Sie können genau sehen, was es tun.

In der neueren Version (wahrscheinlich 2006a und später, aber ich erinnere mich nicht), Mathworks begann mit einem Just-in-Time-Compiler für den Interpreter. In der Tat stellt diese JIT-Compiler automatisch alle mex Funktionen, so explizit offline tut gar nicht helfen. In jeder Version seitdem haben sie setzen auch viel Mühe in die Herstellung des Dolmetschers viel schneller. Ich glaube, dass neuere Versionen von Matlab nicht einmal lassen Sie automatisch Dateien m Dateien kompilieren mex, weil es keinen Sinn macht, nicht mehr.

Der MATLAB Compiler hüllt Ihren m-Code und sendet es zu einer MATLAB-Laufzeit. So soll die Leistung, die Sie in MATLAB zu sehen sein, die Leistung, die Sie mit dem Compiler zu sehen.

Per den anderen Antworten, Code Vektorisierung ist hilfreich. Aber die MATLAB JIT ziemlich gut in diesen Tagen und viele Dinge, und kostet nur etwa auch vektorisiert oder nicht. That'a nicht zu sagen, dass es nicht Performance-Vorteile sind aus Vektorisierung gewonnen werden, es ist einfach nicht die magische Kugel es einmal war. Der einzige Weg, wirklich zu sagen, ist es, den Profiler zu verwenden, um herauszufinden, wo der Code Engpässe zu sehen. Oft gibt es einige Orte, wo man lokales Refactoring wirklich tun können, um die Leistung Ihres Codes zu verbessern.

Es gibt ein paar andere Hardware-Ansätze, die Sie auf die Leistung nehmen. Erstens, ein großer Teil der linearen Algebra-Subsystem ist multithreaded. Sie können sicherstellen möchten Sie, dass in den Einstellungen aktiviert, wenn Sie auf einem Multi-Core oder Multi-Prozessor-Plattform arbeiten. Zweitens können Sie das Parallel Computing Toolbox verwenden, um mehr den Vorteil von mehreren Prozessoren zu nutzen. Schließlich, wenn Sie ein Simulink-Benutzer sind, können Sie in der Lage sein emlmex zu verwenden m-Code in c zu kompilieren. Dies ist besonders effektiv für feste Punkt Arbeit.

Haben Sie versucht, Ihren Code Profilierungs? Sie müssen nicht den gesamten Code vektorisieren, nur die Funktionen, die Zeit dominieren läuft. Die MATLAB-Profiler gibt Ihnen einige Hinweise auf, wo Ihr Code die meiste Zeit verbringt.

Es gibt viele andere Dinge, die Sie Sie auf der Tipps für die Verbesserung der Leistung Abschnitts im MathWorks Handbuch.

mcc wird Ihren Code überhaupt nicht beschleunigen - es ist nicht wirklich ein Compiler.

Bevor Sie aufgeben, müssen Sie den Profiler laufen und herauszufinden, wo all Ihre Zeit geht (Tools-> Open Profiler). Auch vernünftige Nutzung „tic“ und „toc“ kann helfen. Sie optimieren Ihren Code nicht, bis Sie wissen, wo die Zeit geht (nicht versuchen zu erraten).

Halten Sie

Sie daran, dass in Matlab:

  • Bit-Level-Operationen sind wirklich langsam
  • Datei-I / O ist langsam
  • Schleifen sind in der Regel langsam, aber Vektorisierung ist schnell (wenn Sie den Vektor-Syntax nicht kennen, lernen sie)
  • Kerngeschäft ist wirklich schnell (zum Beispiel Matrix multiplizieren, fft)
  • , wenn Sie denken, dass Sie etwas schneller in C / Fortran tun können / etc, können Sie eine MEX-Datei schreiben
  • gibt es kommerzielle Lösungen Matlab C (google "Matlab c"), und sie arbeiten
  • konvertieren

Sie könnten Port Ihr Code „Embedded Matlab“ und dann die Realtime-Werkstatt, um es zu C zu übersetzen.

Embedded Matlab ist eine Teilmenge von Matlab. Dabei spielt es keine Handy-Arrays, Graphiken, Marices dynamischer Größe oder einige Matrix Adressierungsarten unterstützen. Er kann sich auf Embedded Matlab erhebliche Anstrengungen in den Hafen nehmen.

Realtime-Workshop ist der Kern der Code Generation Produkte. Es spuckt generic C, oder kann für eine Reihe von Embedded-Plattformen optimieren. Die meisten interresting Sie ist vielleicht die xPC-Target, die für allgemeine Zwecke Hardware als eingebettetes Ziel behandelt.

I für die Profilierung wählen würde + dann schauen, was die Engpässe sind.

Wenn der Engpass Matrix Mathematik ist, sind Sie wahrscheinlich nicht besser tun würde ... außer einem großen Gotcha ist Array Zuordnung. z.B. wenn Sie eine Schleife:

s = [];
for i = 1:50000
  s(i) = 3;
end

Dies hat zu halten das Array Ändern der Größe; es ist viel schneller das Array Vorschlichte (Start mit Nullen oder NaN) & füllen Sie es von dort aus:

s = zeros(50000,1);
for i = 1:50000
  s(i) = 3;
end

Wenn der Engpass Ausführungen einer Menge von Funktionsaufrufen wiederholt wird, das ist eine schwierige Frage.

Wenn der Engpass Zeug ist, dass MATLAB nicht schnell tun (bestimmte Arten von Parsing, XML, wie das Zeug), dann würde ich Java verwenden, da MATLAB läuft bereits auf einer JVM und es Schnittstellen wirklich leicht auf beliebige JAR-Dateien. Ich sah mit C / C ++ an Schnittstelle und es ist wirklich hässlich. Microsoft COM ok ist (nur unter Windows), aber nach Java lernen, ich glaube nicht, dass ich jemals das gehe zurück.

Wie andere haben zur Kenntnis genommen, langsam Matlab-Code ist oft das Ergebnis einer unzureichenden Vektorisierung.

Aber manchmal sogar vollkommen vektorisiert Code ist langsam. Dann haben Sie mehrere Möglichkeiten:

  1. Prüfen Sie, ob es irgendwelche Bibliotheken / Werkzeugkästen Sie verwenden können. Diese wurden in der Regel geschrieben sehr optimiert werden.
  2. Profil
  3. Code, findet die enge Stellen und schreiben diejenigen in Ebene C Anschluss C-Code (wie DLLs zum Beispiel) in Matlab ist einfach und wird in der Dokumentation enthält.

Mit dem Matlab Compiler meinen Sie wahrscheinlich den Befehl mcc, die den Code ein wenig durch Umgehen Matlab-Interpreter nicht beschleunigen. Was deutlich den Matlab-Code beschleunigen würde (um den Faktor 50 bis 200) die Verwendung von tatsächlichem C-Code ist durch den mex Befehl zusammengestellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top