Wie Optimiere ich beim Matrix_berechnen?



  • Hallo alle,

    ich habe ein Matlab Programm zu einen c++ Programm portiert(Berechnen den GPS_Koordinaten). Im beiden Programmen sollen Matrix2D bzw. Matrix3D berechnet werden.

    Beispielweise:
    1. int_Zahlen * Matrix2D[a][b]
    2. Inhalte von einem Matrix2D zu anderem kopieren: Matrix2D[a][b] ->Matrix2D_copie[a][b]
    3. Matrix3D[i][m][n] * Matrix3D[i][m][n]
    4. Matrix2D[m][n] + Matrix3D[i][m][n]

    Alle Berechnen sind durch for_schleife bzw. verschachtelte for_schleife realisiert.
    Das Problem ist, dass bei gleichen InputDaten MatLab Programm deutlich schneller als C++ Programm ist(ca. 1.6sec to 2.0sec).
    Normalweise sollen c bzw. c++ Programme viel schneller sein.

    Meine Frage ist, gibt es irgendwelche Methoden oder Bibliotheken, mit dem lassen das c++ Programm schneller laufen.

    Vielen Dank im voraus



  • Ich denke, dass Matlab so weit optimiert ist, dass das keine Rolle mehr spielt.

    Du kannst ja mal ein paar Math libs testen und schauen, ob die schnellere Berechnungen liefern.

    Such mal nach BLAS, VXL und Matrix Template Library 4.



  • Zu Deinen Punkten:
    1. sequentieller Zugriff auf die Elemente statt verschachtelte Schleife. Matrix auf 1D-Array abbilden.
    2. std::copy bzw. std::memcpy
    3. evtl. Strassen-Multiplikation oder was vergleichbares, was die Ordnung des Problems drückt.
    4. keine Ahnung was für eine Operation das sein soll

    Dann könntest Du Dir mal boost::ublas, blitz++ usw. anschauen. Du solltest auch die Namensgebung von Matrix2D und Matrix3D überdenken, falls diese das machen, was ich vermute. Soll Matrix3D ein Tensor der Stufe 3 sein und Matrix einer der Stufe 2 oder bezieht sich 2D/3D auf die Dimensionen der Matrizen?



  • Du wirst Matlab niemals schlagen, denn Matlab kompiliert das Matlab-Programm zumindest teilweise und ihre Mathe-Operationen sind extrem optimiert (ganz besonders Matrizenoperationen). Ich rate dir einfach eine fertige Bibliothek wie ATLAS zu benutzen.

    Und dein Programm ist hauptsächlich deshalb langsamer weil du durch deine Art der Berechnung den Cache nicht nutzt (und wahrscheinlich noch nicht einmal weißt wie C++ intern ein 2dimensionales Array abspeichert).

    Also nochmal: überlass das Schreiben von Mathefunktionen den Profis und begnüg dich damit diese einfach nur einzusetzen.



  • hi,

    nen bisselspät gelesen...matlab ist wirklich nicht das schnellste. ich hatte mal einen performance test geamcht und Matrix TCL war ca. 7 mal schneller als matlab:

    http://www.techsoftpl.com/matrix/download.htm

    ist vorallem auch extrem leicht zuimplementieren (nur eine header datei!)

    --> solltest aber von hand die maximale größe der matrizen anpassen.



  • Wie hast Du das gemessen und vor allem anhand welcher Operationen. Matlab ist sicher langsamer als ein von Hand optimierter Code, allerdings ist der Faktor 7 so als Pauschalaussage unglaubwürdig.



  • also ich habe einfach die Tickdifferenz als zeitmessung benutzt und bei matlab den profiler

    also ich habe 3 matrizen (von 100x100 bis 7500x7500) erstellt und 2 Matrizen dann mit for schleifen an jeder Stelle gefüllt. Ich habe auch für matlab schon extra die matrizen mit zeros erstellt (jeder der matlab benutzt weiß das dies deutlich schneller ist). der faktor 7 zieht sich konsequent durch die messung. (Matrizen operationen habe ich nicht getestet, da ich diese nicht brauche - aber ich habe das gerade mal für ne 500x500 gestestet - Matlab ist da aufjedenfall schneller wenn es um Matrizen Multiplikation geht!!!)

    der faktor sieben bezog sich aber nur auf die MATRIX TCL, so schnell war sonst keine.



  • Man könnte auch mit Expression Templates und PETE optimieren. Hier ein paar Links dazu...

    PETE Beschreibung + Tutorial
    PETE + POOMA + Download

    Gruß
    Tobi



  • Dankeschön für die Antwort.
    Ich werde die Vorschläge ausprobieren und dann sage euch das od. die Ergbnis.


Anmelden zum Antworten