Performance Matrix Multiplication

NetzUnity und Informatik-forum wurden zusammengelegt. Eine entsprechende Ankündigung wird demnächst noch folgen. Für 2025 ist hier einiges geplant! Bei Fragen bitte per DM an Maximilian Rupp wenden.
  • Hallo,

    Ich multipliziere 40 Mil Vektoren mit einer Matrix. Initialisiere die Matrix, die Vektoren und führe die Multiplikation inklusive Zeit-Messung aus.

    Jemand eine Idee warum die Performance steigt wenn ich die auskommentierte Zeile einkommentiere? Ich verwende GLM.

    Performance mit Zeile: ~170ms
    Performance ohne Zeile: ~265ms

    vgl in Java:
    optimierte Version: ~223ms
    mit lwjgl.util: ~330ms


    edit: (die optimierte Java Version in 1:1 C++ kommt im Übrigen auf ca 190ms)

    Matthias
    CGUE, Vis2, Infovis Tutor

    2 Mal editiert, zuletzt von Necrowizzard (24. Februar 2012 um 07:41)


  • Jemand eine Idee warum die Performance steigt wenn ich die auskommentierte Zeile einkommentiere? Ich verwende GLM.

    Könnte es theoretisch am caching liegen?
    Was passiert wenn du die Zeile in die Zeitmessung inkludierst? (natürlich ohne dem cout)

    Welcher Sinn steckt eigentlich hinter nachfolgendem Konstrukt?

    Code
    for (int j=0; j<1; j++)
    {
    }

    Die vertices werden am Ende schon noch irgendwo freigegeben oder? (delete[] vertices)

    Thomas

  • Habe vor längerer Zeit Mal aus Langeweile nach Geschwindigkeitsvergleichen von Sprachen gesucht.. Da habe ich mich an diesen Post erinnert.. Könnte es damit was zu tun haben?
    http://stackoverflow.com/a/146186


    Liebe Grüße,
    emptyvi

  • Könnte es theoretisch am caching liegen?
    Was passiert wenn du die Zeile in die Zeitmessung inkludierst? (natürlich ohne dem cout)

    Welcher Sinn steckt eigentlich hinter nachfolgendem Konstrukt?

    Code
    for (int j=0; j<1; j++)
    {
    }

    Die vertices werden am Ende schon noch irgendwo freigegeben oder? (delete[] vertices)

    Thomas

    Hi,

    Ja das mit caching war auch eine meiner Vermutungen, also dass z.B. unter Umständen die transform-Matrix nach der langen for-Schleife aus dem cache wandert; jedoch bin ich etwas verwundert, dass der Compiler sowas nicht optimiert und dass nur ein cache miss hier soviel Performance unterschied mache kam mir auch eigenartig vor.

    (Auch von stackoverflow: "For comparison, on one particular modern multicore PowerPC CPU, an L1 miss is about 40 cycles", das könnte so in etwa mit 2 misses hin kommen.)

    Diese for-Schleife hat nur den Sinn dass ich auch testweise j variiert habe und die Performance verglichen.
    Auf delete hatte ich vergessen, aber das macht eigentlich nichts, da es hier nur um einen Performance Vergleich ging. (Der Stack war zu klein, sonst hätte ich die Matrix ja dort gelassen.)


    Habe vor längerer Zeit Mal aus Langeweile nach Geschwindigkeitsvergleichen von Sprachen gesucht.. Da habe ich mich an diesen Post erinnert.. Könnte es damit was zu tun haben?
    http://stackoverflow.com/a/146186

    Hm also Fortran kenne ich leider nicht, aber rein theoretisch (nach meinem verständnis) sollte es keinen Memory overlap geben, da die eine variable am heap und die andere am stack liegen sollte.


    Trotzdem danke vorerst für die Antworten.

    Matthias
    CGUE, Vis2, Infovis Tutor

    3 Mal editiert, zuletzt von Necrowizzard (25. Februar 2012 um 23:59)

  • ich etwas verwundert, dass der Compiler sowas nicht optimiert und dass nur ein cache miss hier soviel Performance unterschied mache kam mir auch eigenartig vor.

    Naja, was der compiler optimiert und was nicht ist immer so eine sache, hast du -O3 beim g++ probiert?
    Ein anderes interessantes Szenario wäre die transfrom Matrix gleich unten zu deklarieren und definieren!
    Für die matrix-multiplikation sind die SSE extensions interessant, ich weiss nicht ob die GLM sie (für die multiplikation) benutzt.

    Wieviel Zeit ein cache miss kosten kann kann ich dir nicht sagen, ist auch ein typisches problem mit echtzeitgeschichten, in deinem fall sinds wohl 3 cache misses (L1 - L2 - L3).
    Was tut das ding wenn du die Zuweisung ins Zeit messen hineinnimmst? (hast du es getestet?)

    Thomas

  • Naja, was der compiler optimiert und was nicht ist immer so eine sache, hast du -O3 beim g++ probiert?
    Ein anderes interessantes Szenario wäre die transfrom Matrix gleich unten zu deklarieren und definieren!
    Für die matrix-multiplikation sind die SSE extensions interessant, ich weiss nicht ob die GLM sie (für die multiplikation) benutzt.

    Wieviel Zeit ein cache miss kosten kann kann ich dir nicht sagen, ist auch ein typisches problem mit echtzeitgeschichten, in deinem fall sinds wohl 3 cache misses (L1 - L2 - L3).
    Was tut das ding wenn du die Zuweisung ins Zeit messen hineinnimmst? (hast du es getestet?)

    Thomas

    Hallo,

    Ja wollte es gerade schreiben, nur das forum will nicht so ganz. Also ox hab ich grad probiert, trotzdem ist die Version langsamer (verwende den visual studio 2010 compiler).

    Wenn ich die Zuweisung später mache, selbst wenn ich sie in der j-for-schleife mit mehreren Durchläufen mache, bekomme ich eine bessere Performance.


    edit: selbst wenn ich die zuweisung am ende des letzten druchlaufes innerhalb der vertices-zuweisungs-for-schleife mache, bleibt meine performance schlecht. sobald es irgendwo nach dieser schleife passiert ist die verbesserung merkbar.

    edit2:
    selbst sowas:

    Code
    for (int i=0; i<size; i++) {            
        transform = mat4(1.0f);
        vertices[i] = transform * vertices[i];
    }


    ist schneller; möglich wäre es schon auch dass es eine GLM interne optimierung ist (habe mir das aber noch nicht durchgesehen)

    Matthias
    CGUE, Vis2, Infovis Tutor

    4 Mal editiert, zuletzt von Necrowizzard (26. Februar 2012 um 00:17)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!