LinearAlgebra UDF - LinearAlgebra für AutoIt mit BLAS/LAPACK

  • Lineare Algebra in AutoIt

    Eine Bibliothek zur linearen Algebra, entwickelt in AutoIt. Diese Bibliothek bietet eine Vielzahl von Funktionen zur Durchführung von Berechnungen und Operationen in der linearen Algebra.

    Idee

    Eine UDF zur Linearen Algebra in AutoIt.
    Ziel dieser ist es möglichst thematisch umfassend, performant und einfach zugänglich zu sein.

    Als Grundlage der UDF dient die weit verbreitete Softwarebibliothek BLAS/LAPACK.
    Der Nutzer soll bei der Verwendung möglichst intuitiv arbeiten können und ohne größere adminstrative Aufwände auskommen.

    Ein besonderer Schwerpunkt liegt in umfangreichen Funktionalitäten zur Ausgleichungsrechnung.

    Aufbau

    Die UDF ist in 3 Teil-UDFs untergliedert: BLAS.au3, LAPACK.au3 sowie LinearAlgebra.au3.
    In den ersten beiden sind die Low-Level-Schnittstellen zu den jeweiligen BLAS/LAPACK-Funktionalitäten implementiert.
    Auf dieser Basis baut die LinearAlgebra.au3 auf, welche als primäre Schnittstelle für den Endanwender gedacht ist.
    Die Funktionen hier bieten einfacherere Schnittstellen und Zugang zu komplexeren Algorithmen wie z.B. Regressionen und Ausgleichungsrechnung.

    Neben diesen 3 Dateien wird zusätzlich noch eine DLL benötigt, welche die BLAS/LAPACK-Schnittstelle implementiert.

    Einrichtung

    • Download der 3 Dateien `BLAS.au3`, `LAPACK.au3` sowie `LinearAlgebra.au3` (oder gleich clone des Repositories) von >>Hier<<
    • Download einer aktuellen BLAS/LAPACK-DLL:
      • Empfehlung: OpenBLAS (theoretisch sollten auch andere BLAS/LAPACK-Implementierungen funktionieren - jedoch sind dann evtl. zusätzliche Anpassungen notwendig)
      • Download der Datei OpenBLAS-x.x.xx-x64.zip und Extraktion der Datei libopenblas.dll in den selben Ordner wie die LinearAlgebra.au3
    • Nun sollten die Beispieldateien im Unterordner /examples ausführbar sein.

    Umfang

    Dokumentation
    Die Dokumentation zu den einzelnen Funktionen ist direkt im Quellcode enthalten. Jede Funktion ist mit einer Beschreibung versehen, die ihre Parameter und Rückgabewerte erklärt. In den meisten Fällen ist hier auch ein kurzes Beispiel mit hinterlegt. Zudem findest du detaillierte Erklärungen in den Beispieldateien.


    ToDo

    • Bestimmte Funktionen (z.b. _la_add(), _la_mul(), _la_solve(), _la_inverse() ...) sind derzeit für den allgemeinen Fall implementiert. Diese profitieren jedoch entsprechend, wenn die spezifischen Funktionen für spezielle Matrixgeometrien (symmetrische Matrizen, Dreiecksmatrizen, Bandmatrizen, ...) jeweils verwendet würden. Die hierfür notwendigen Grundfunktionen sind bereits in der BLAS.au3 und LAPACK.au3 implementiert.
  • Hi,

    beim Download der libopenblas.dll von https://github.com/OpenMathLib/OpenBLAS/releases funktioniern nur die x64-*.dll-Dateien.

    Dazu muss dann aber auch im AutoItscript #AutoIt3Wrapper_UseX64=y gesetzt werden.

    Die x86*.dll lässt sich, zumindest aktuell bei mir, nicht downloaden...

    Lt Beschreibung in den make-Files ist es möglich, die libopenblas.dll u.a. auch für "neuere" Prozessoren kompilieren zu lassen, also auch Unterstützung von bspw. AVX512. Die Dll soll dann automatisch die zum Prozessor passende Funktion auswählen....schaumamal^^

  • Die x86*.dll lässt sich, zumindest aktuell bei mir, nicht downloaden...

    Downloaden lässt sie sich bei mir durchaus problemlos (ich habe die OpenBLAS-0.3.28-x86.zip genommen und dort liegt die dll im Unterverzeichnis /bin/libopenblas.dll).

    Allerdings taucht damit ein völlig anderes Problem auf: Die allermeisten Skripte laufen nicht unter 32 Bit, was aber überhaupt nicht mit der BLAS-DLL zusammenhängt.
    Das Problem lag an anderer Stelle: Um Matrizen zu kopieren verwendete die UDF bisher RtlCopyMemory, was aber offensichtlich für 32 Bit-Programme gar nicht zur Verfügung steht.
    Ich hab das daher einfach durch memcpy ersetzt und nun laufen die Skripte bei mir auch unter 32 Bit.

    Das entsprechende Update habe ich hochgeschoben.

  • ja, jetzt funktioniert der Download....

    Was aber auch nicht nachvollziehbar macht, warum es für 32 Bit keine libopenblas32.dll gibt und für 64 Bit eine libopenblas64.dll

    Wenn schon für unterschiedliche Architekturen compiliert wird, dann sollte man auch die Dateinamen unterscheiden können....

    Clevererweise, WENN man schon meint, EINEN Dateinamen verwenden zu müssen, dann compiliert man 32-Bit und 64-Bitfunktionen mit gleichem Namen (ja das geht!!) in EINE Datei und lässt die Architektur entscheiden....

    Selbst in solch belächelten Programmiersprachen wie Interpreter-Scripting AutoIt gibt es eine If @AutoItX64 then....

    verwendete die UDF bisher RtlCopyMemory, was aber offensichtlich für 32 Bit-Programme gar nicht zur Verfügung steht.

    oder durch RtlMoveMemory ersetzen....


    Habe aktuell nicht viel Zeit, aber ich möchte sehen, was die einzelnen Funktionen können (seitens Geschwindigkeit s. Assemblerfunktion zum Aufsummieren direkt in AutoIt )

    Da meine (kostenlose) Version von IDA Pro nur 32-Bit disassemblen kann, hat ggf. jemand die Möglichkeit bzw. eine Software, die 64-Bit-libopenblas.dll zu disassemblieren mit ähnlichem Funktionsumfang wie IDA Pro?

  • oder durch RtlMoveMemory ersetzen....

    Da ich nicht überlappend kopieren muss ist memcpy die schnellere Option.

    aber ich möchte sehen, was die einzelnen Funktionen können (seitens Geschwindigkeit s. Assemblerfunktion zum Aufsummieren direkt in AutoIt )

    Die Optimierung erfolgt auf vielen verschiedenen Ebenen. Einmal natürlich auf algorithmischer Ebene.
    Zum anderen natürlich die Ebene auf die du schielst: Welche Prozessorbefehle kommen wie zum Einsatz?
    Tatsächlich optimieren diese Bibliotheken noch auf einer anderen Ebene, welche man nicht so einfach aus dem Maschinencode lesen kann.
    Die Abarbeitung erfolgt so, dass die Prozessorcaches möglichst optimal genutzt werden.
    Hierzu gibt es ein sehr bekanntes Paper von Goto, wo beschrieben wird wie er damals vorgegangen ist (während vorherige Implementierungen sich auf den L1-Cache konzentriert haben lag sein Fokus hingegen auf dem L2-Cache).

    hat ggf. jemand die Möglichkeit bzw. eine Software, die 64-Bit-libopenblas.dll zu disassemblieren mit ähnlichem Funktionsumfang wie IDA Pro?

    Wäre >>Ghidra<< von der NSA evtl. etwas was dir weiterhelfen könnte?

  • Wäre >>Ghidra<< von der NSA evtl. etwas was dir weiterhelfen könnte?

    Hehe, das ist wie IDA Pro auf Speed :party:. Komplett das look&feel abgekupfert und dazu noch getuned....:thumbup:

    Der Decompiler ist auch sehr nützlich.

    Die Optimierung erfolgt auf vielen verschiedenen Ebenen. Einmal natürlich auf algorithmischer Ebene.

    Oh ja! UND auf Prozessorspezifischer Ebene. Ich hatte schon in den Compilerflags des GCC gestöbert und dort festgestellt, dass man explizit für bestimmte Prozessorgenerationen (bspw. Sandy Bridge, Haswell, Sky Lake, Bulldozer uswusf.) optimieren kann, und siehe da, in der libopenblas.dll sind reichlich Einsprungpunkte mit diesen Namen und, wie erwartet, für diese Prozessorgeneration optimierter Funktionscode.

    Wenn ich das so grob überblicke, dann wurde sich echt Mühe gegeben :D. Im 64-Bit-Modus gibt es neben den 16 128 Bit breiten XMM-Registern noch etliche andere, bei AVX bis zu 32 512 Bit breite Prozessorregister https://de.wikipedia.org/wiki/Advanced_Vector_Extensions

    Bei AVX-512 sind es aufgrund der Registerbreite von 512 Bit damit pro Befehl acht Additionen in doppelter Genauigkeit oder 16 Additionen in einfacher Genauigkeit.

    Wohlgemerkt in EINEM Prozessortakt (in der Theorie^^). Davon wird definitiv gebrauch gemacht, wer also einen aktuellen Prozessor hat, der bekommt ggf. allein durch die Befehlserweiterung schon einen Geschwindigkeitsvorteil, wer (so wie ich^^) eine alte Gurke als Prozessor hat, der bekommt auch dafür den optimalen (?!) Code compiliert! TOP!

    Es werden also Anwendungen mit der OpenBLAS gesucht, bei denen man dann hier im Forum bspw. Geschwindigkeitsvergleiche der Prozessoren anstellen könnte.8)


    Fairerweise müsste man dann ggf. aber auch überlegen, eine CUDA- oder OpenCL-Bibliothek mit den in OpenBLAS verwendeten Funktionen einzusetzen. https://github.com/xianyi/clOpenBLAS oder https://github.com/CNugteren/CLBlast

    Meiner Erfahrung nach würde eine 100€ Grafikkarte bzw. eine in den Prozessor integrierte GPU die schönen neuen 1000+€ teueren CPU´s um mehrere Faktoren abhängen...aber womit soll dann INTEL sein Geld verdienen:Glaskugel:

    https://cnugteren.github.io/clblast/clblast.html , dort mal eine GTX750Ti (2015) mit einem Intel Skylake (2015) vergleichen....da ist die Graka Faktor 5-10(!) schneller:/


    Die Abarbeitung erfolgt so, dass die Prozessorcaches möglichst optimal genutzt werden.
    Hierzu gibt es ein sehr bekanntes Paper von Goto, wo beschrieben wird wie er damals vorgegangen ist

    Ich empfehle die Optimization Manuals von Agner Fog https://www.agner.org/optimize/ , der nicht nur ein Computer-Nerd ist https://www.agner.org/cultsel/?e=0#0