Beschleunigung von Matlab auf C++ - Konvertierung
Habe ich einige Matlab image processing code, der läuft ziemlich langsam und ich bin auch bereit zu konvertieren es in C/C++. Ich weiß wirklich nicht viel darüber, wie matlab funktioniert und wie der code ausgeführt wird, aber ich bin einfach daran interessiert zu hören, welche Art von Beschleunigungen, die ich erwarten könnte. Klar es gibt viele Variablen, die Einfluss auf dieses, aber ich bin gerade auf der Suche nach einer Anleitung, vielleicht aus Ihrer eigenen Erfahrung.
Dank
Zenna
- Ähmm...einige code-Beispiele wären nett. Sie können nicht nehmen Sie eine langsame und beschissen-Algorithmus in Matlab und erwarten, dass Sie eine Konvertierung machen es schnell. Sie können nicht kämpfen, die Dolmetscherin, kann es sein das der Algorithmus
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meistens kommt es auf die Dichtigkeit Ihrer Schleifen in Matlab. Wenn Sie einfach anrufen, eine Reihe von built-in Matlab image processing-Funktionen, werden Sie wahrscheinlich nicht in der Lage sein, um die Leistung zu verbessern (die meisten wahrscheinlich, dass Sie Tat es weh). Wenn Sie Schleifen über Bild-Pixel oder einer Art von block-Verarbeitung, Sie können sehen, große Verbesserungen. Wenn du da ein paar Schleifen, aber die Menge der Verarbeitung innerhalb jeder iteration ist beträchtlich, Sie können nur sehen, wenig oder keine Verbesserung.
Den Weg ich schaue auf Matlab ist, dass jede ausgeführte Zeile hat eine gewisse Menge an overhead. Wenn Sie können, legen Sie Ihre Lösung in form einer matrix multiplizieren, oder einige andere Vektor - /matrix-operation, die Sie nur leiden, overhead einmal, und es ist vernachlässigbar. Jedoch, mit Schlaufen, Sie leiden, overhead jedes mal, wenn die Schleife iteriert. Auch die meisten der Matlab image processing-Funktionen sind nur Anrufe aus einer optimierten Bibliotheken, also nicht versuchen, Sie neu erstellen, es sei denn, Sie sicher wissen, wo Sie verbessert werden können.
Fand ich, dass der beste Ansatz ist die Verwendung einer Kombination von C-und Matlab. Ich benutze Matlab, wenn der Vorgang kann leicht vektorisiert (in Bezug auf Vektor/matrix-Operationen). Dies kann bedeuten, kommt die Lösung aus einem anderen Blickwinkel als dem, was scheint die einfachste. Auch ist es schwer zu schlagen Matlab ist das zeichnen und Visualisierung, so würde ich definitiv nicht verschieben zu einem C/C++ - Lösung, es sei denn, Sie haben einen plan, wie Sie die Anzeige mit C/C++ (wenn es das ist Teil des Projekts).
Wenn ich nicht kommen mit einem relativ einfachen Weg zu Vektorisieren, ich habe gerade implementieren, die Teil der Verarbeitung, die Bedürfnisse engen Schleifen in einer C-mex-Funktion, die aufgerufen werden kann, Matlab. Ich Neige dazu, verwenden Sie C anstelle von C++ in diesem Fall, da der Prozess sollte relativ gering sein und müssen nicht eine Vielzahl von komplizierten Abstraktion der Daten, aber C++ arbeiten würde, auch in Ordnung. Stellen Sie sicher, dass Sie Zugriff auf Bild-Daten im column-major-Reihenfolge, um cache-hits, da dieser ist, wie Matlab werden die Matrizen.
Es hängt wirklich von der Qualität Ihrer Matlab-Codes sind und was Sie tun. Idiomatische Matlab-code geschrieben, die von einem Matlab Experten ist schwer zu schlagen, vor allem, wenn Sie nicht eine Optimierung guru und rein rechnen, die eine Geschwindigkeit durch das Umschalten der Sprache. Zum Beispiel fand ich sogar einige der angesehenen C-basierte FFT-Bibliotheken waren keine übereinstimmung für Matlab die FFT.
Sagte, der Vergleich einer schlecht geschriebenen Matlab-Programm zu einem durchschnittlich geschrieben, c++, ich würde sagen, Sie sind Blick auf eine Größenordnung, die in meiner Erfahrung.
Die kurze Antwort auf die Frage, welche Art von Beschleunigungen, die Sie bekommen kann ist "es hängt".
Matlab ist ein interpreter, so dass es insgesamt viel langsamer als nativer c++ code. Jedoch, viele matlab-Funktionen sind gut optimiert, und die neueren Versionen sind JIT. Sie müssten also entscheiden, ob Sie umschreiben alle Ihren matlab-code in C umschreiben, dass nur die kritischen Teile, oder zur Optimierung der matlab-code selbst, um schneller zu laufen.
Ich würde vorschlagen, dass Sie beginnen, indem Sie mit Hilfe von Matlab integrierte profiling-tools, um die performance-Engpässe in Ihrer Anwendung. Es kann der Fall sein, dass Sie möglicherweise zu zwicken, der matlab-code, um bessere Leistung zu erhalten. Die Faustregel ist, zu vermeiden Schleifen durch die Verwendung vektorisierter array-Operationen statt der Iteration ein element zu einem Zeitpunkt.
Z.B. matlab verwendet die FFTW-Bibliothek zur Implementierung von fft-algorithmen. Die Leistung der Bibliothek ist fast unmöglich zu schlagen. Die einzige, die ich kenne, die vergleichbar ist mit der intel Math Kernel Library (MKL), aber kommerziell ist. Also zu aller erst würde ich vorschlagen, das jeder der mathematischen library, die Sie finden können. Matlab ist dabei, dass hinter den kulissen.
Es ist wahr, es ist manchmal nur schwer zu schlagen ist matlab. Aber die Sache ist, dass die matlab-profiler nicht immer gibt Ihnen genug Informationen darüber, wie zu verbessern Sie Ihre code. Sie wissen, dass einige matlab-Methoden nehmen die meisten der Zeit, aber Sie nicht immer wissen, wenn die Möglichkeiten, um die Leistung zu verbessern, nannte Sie in einer anderen Weise da, die Methode ist eine black-box.
In C/C++ haben Sie tools wie valgirnd, die es Ihnen ermöglicht zu prüfen, selbst wenn der assembler, dass der compiler generiert, so dass Sie kann helfen, den compiler zur Verbesserung der code-inlining eine Methode für die Instanz. Aber wieder matlab ist die Verwendung von professioneller mathematische Bibliotheken hinter den kulissen und wenn die meisten der Zeit verbringen Sie auf diese Bibliotheken, wenn Sie ausführen Ihrer matlab-code die Leistung ist dann schwierig, sich zu verbessern.
Ich würde Sie könnten versuchen, einen anderen Ansatz. Sie können die analyse der Engpässe mit matlab profiler einen sehen, ob es sich lohnen würde es zu bewegen, dass code in systemeigenen code. Matlab ermöglicht es Ihnen, die. Sie können es auch tun, die andere Weise herum. Können Sie implementieren, einige Kleber, die in C/C++ und und rufen Sie matlab für einige Operationen, wo Sie erfahren haben, dass Ihr native code ist langsamer, dass matlab.
Für die Bildverarbeitung können Sie bekommen zu einem merklichen Geschwindigkeitszuwachs. Aber das hängt wirklich davon ab, wie gut du im schreiben von MATLAB-code. Viele Dinge kann vektorisiert oder in Pflege genommen werden, indem die eingebauten Funktionen. Diese Art von code ist rasend schnell.
Jedoch, wenn Sie Ihre code, um aus einer Menge von Schlingen (wie z.B. Schleifen über alle Pixel in einem Bild), es wird unglaublich langsam und Vektorisierung geben kann 100x speedup oder mehr.
Wenn Ihr code ist sehr schwer zu tun, "Recht" in MATLAB, wechseln Sie zu C kann eine sinnvolle option sein. Ich habe eine computer-vision-Projekt in der Schule (3D-Punkt-Rekonstruktion), die deutlich zeigte. Wenn unser Projekt, dessen Umsetzung in C++ und OpenCV, fertig war die Berechnung, eine von den anderen Gruppen Projekte hatten kaum noch geladen werden die Bilder noch. Die ihrigen wurden in MATLAB geschrieben. Wir haben nie zeitlich es, aber meine denke ist, dass unsere version lief etwa 10 mal schneller.
Aber dann wieder, Ihre MATLAB-code war wohl nicht optimiert auf alle. Es ist also nicht wirklich nützlich, wie ein benchmark.
Ich haben, exportieren Sie eine matlab-routine in c++ und kompilieren mit visual studio c++ als mex. Der speedup wurde ein Faktor von 10. und wenn würde ich die Verwendung von multi-cores, dann hätte ich vermutlich auch 3 mal mehr speed.
Wenn Sie Pisten Pisten und etwas mit den einzelnen Komponenten der matrix, so etwas wie y(m,n) = x(m) * a - x(m-1) und diese in für die Pisten dann haben Sie eine gute Beschleunigung.
wenn Sie zu viele matlab-Funktion für die Berechnung, wo die matlab-Funktion selbst viele Operationen, dann macht es weniger Sinn, export-code in c++.
Wie andere gesagt haben, verwenden Sie die MATLAB-profiler, um zu sehen, was die Flaschenhälse sind. Wenn es die matrix number-crunching, hast du eine ziemlich hohe Messlatte zu überspringen, um zu schlagen MATLAB. Wenn Sie haben eine Menge von bedingten Anweisungen und Verzweigungen oder Funktionsaufrufe, Sie sind eher in der Lage, verbessern Sie Ihre Geschwindigkeit.
Stellen Sie sicher, Sie versuchen, minimieren Sie die Anzahl von Zeiten, Daten zwischen MATLAB und C++. Wenn Sie das senden von großen Daten-arrays in einem großen Klumpen, der es wahrscheinlich zu schnell. Ansonsten, wenn Sie viel Daten überträgt hin und her, auch wenn Ihr C++ - Programm ist schnell, verlieren Sie möglicherweise den speed-Vorteil in die Konvertierung der Daten.
Ich würde auch einen Blick auf Ihre algorithmen und prüfen mit Java. Es ist sehr praktisch, um eigene Java-code aus MATLAB, da MATLAB läuft bereits auf ein JRE. Ich war sehr beeindruckt von der Geschwindigkeit der übertragung von großen Daten-arrays zwischen MATLAB-Funktionen und meine benutzerdefinierte Java-code. Ich hatte mir bei der Umsetzung eines Algorithmus gerade C++ (unter Verwendung von MEX oder was auch immer) vor ein paar Jahren zu beschleunigen, MATLAB, und es sah nur wie ein Albtraum, der sich mit den Datenstrukturen. Ich landete mit COM/ActiveX anstelle, weil ich auf einem Windows-Rechner und die Anbindung war das viel einfacher.
Nachdem Sie dies getan haben eine Menge von low-level-Programmierung zu lösen numerischer Probleme, ich habe eine bessere Wertschätzung für das, was schief gehen kann, von der numerischen Genauigkeit der Programmierung Probleme bei der Wartung, und es sei denn, es gab einen enormen performance-Vorteil, ich würde wählen, eine höhere Ebene, die die Sprache jeden Tag über C/C++.