Matrixfunktionen - schnell durch Inline-Assembler

  • In XProfan X4 fehlen eine Reihe von Matrix- und Vektorfunktionen, obwohl mit der MAT-Anweisung schon einige Funktionen verfügbar sind. Programmiert man eine Matrixmultiplikation mit Profan-Befehlen steigen die Rechenzeiten exorbitant an. Damit kann man nur kleine Matrizen bearbeiten.
    Dank des Inline-Assemblers kann man diese Operationen aber in praktikabler Zeit ausführen. Die angefügten Prozeduren leisten:
    1. Skalarprodukt zweier Vektoren
    2. Vektornorm
    3. Determinante einer quadratischen Matrix
    4. Lösung eines linearen Gleichungssystems
    5. transponieren einer Matrix
    6. echte Multiplikation zweier Matrizen
    7. echte Multiplikation zweier quadratischer Matrizen (braucht weniger Parameter als 6.)
    8. Multiplikation einer quadratischen Matrix mit einem Vektor
    9. Inverse einer quadratischen Matrix
    10. Zeilenvektor einer quadratischen Matrix
    10. Spaltenvektor einer quadratischen Matrix
    Damit können auch relativ große Matrizen (Dimension im 3-stelligen Bereich) bearbeitet werden.
    Mit meinem Rechner (Intel i7 12700K) werden zwei Matrizen der Dimension 1000 x 1000 in 1,6 s multipliziert. Die Lösung eines Gleichungssystems mit 1000 Gleichungen und 1000 Unbekannten dauerte 567 ms (alles Momentanwerte aus einem Durchlauf). Die Berechnung der inversen Matrix brauchte 38 s.
    Für die Dimension 100 x 100 betragen die Werte: Matrizenmultiplikation: < 10 ms; lineares Gleichungssystem: 16 ms; Inverse Matrix: 377 ms (ebenfalls nur ein Durchlauf).
    Ich habe ein kleines Demo-Programm beigefügt. In der zugehörigen Include-Datei sind u.a. Routinen zur Ausgabe von Matrizen und Vektoren enthalten.
    Noch eine Anmerkung zum Inline-Assembler. Der Einsatz bietet sich immer dort an, wo Daten für Berechnungen in den Registern des Prozessors gehalten werden könne und wo Schleifen abzuarbeiten sind. Beides ist in den obigen Funktionen der Fall.

    Gruß
    Arndt

    Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen. Der Inhalt kann nicht angezeigt werden, da Sie keine Berechtigung haben, diesen Inhalt zu sehen.

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress, WoltLab & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Sehr interessant.

    Werde ich mir am Wochenende auf jeden Fall mal anschauen.

    Was mich an MAT etwas stört, ist daß man den &index nicht mittendrin greifen kann,

    z. B. mit einer IF() - Funktion. z.b.

    Code
    MAT c[] + If(&index Mod 2 = 0, Rnd(a - b) - b, 0)

    Zufallszahl nur bei geraden Zahlen.


    Ansonsten ist es ja mit dem AUSDRUCK auch so eine Sache :

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    3 Mal editiert, zuletzt von H.Brill (22. Februar 2024 um 17:44)

  • Ich habe da mal einen Beispielcode geschrieben. Leider bringt das an der Stelle überhaupt nichts. Für diese Aufgabe ist eine einfache For-Schleife in Profan wahrscheinlich die effektivste Lösung.

    Die Rechenzeit wird wahrscheinlich von der RND-Funktion dominiert.

    Gruß

    Arndt

  • So, wie ich das sehe, wird die Funktion bzw. Ausdruck schon beim Aufruf von

    MAT ausgewertet bzw.berechnet. In der eigentlichen Schleife von MAT wird

    nur das Ergebnis davon mit +, -, /, * < mit dem &index verrechnet. Das Rnd()

    wird nur einmalig bei Aufruf ausgeführt. Ich hätte gerne sowas gehabt :

    Code
    Proc MatArrayLong
    Parameters Long x[]
    Randomize
    WhileLoop 0, SizeOf(x[]) - 1
     x[&LOOP] = Rnd(a - b) - b
    EndWhile
    EndProc

    Wenn ich als Parameter noch ausdruck mitgeben würde, würde dieser ja auch

    beim Aufruf der Proc einmalig berechnet und übergeben. Und genau da ist der Haken,

    den auch RGH wohl nicht beseitigen konnte. Vielleicht könnte man da auch eine Art

    CALLBACK-Funktion einklinken.

    Wie auch immer, der Geschwindigkeitsvorteil, um den es ja auch geht, wäre dann dahin.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    Einmal editiert, zuletzt von H.Brill (24. Februar 2024 um 09:01)

  • Dieses Beispiel realisiert eine Multiplikation mit dem Index. Für die anderen Operationen sind geringfügige Anpassungen der Assemblerroutine erforderlich. Was allerdings nicht geht ist die Verwendung von &Index in dem zu übergebenden Ausdruck. Dieser wird ja bereits vor dem Beginn der Schleife ausgewertet. Damit ist dies Routine mit MAT x[] < <Ausdruck> identisch. Man kann mit dieser Vorgehensweise lediglich die Multiplikation der Werte auf Addition, Subtraktion und Division ausweiten.

    Für den Datentyp double kann man die Routine ebenfalls anpassen. Für Strings macht es keinen Sinn.

    Gruß

    Arndt

Jetzt mitmachen!

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