Hallo zusammen,
ich interessiere mich auf sehr grundlegendem Level für KI (NN) und allgemeiner Signalverarbeitung.
Bei der Simulation von Neuronalen Netzen werden im Grunde Formeln in der Art Y = ax + b ausgewertet. Wobei wir hier über gigantische Vektoren, Matritzen, bzw. Tensoren sprechen.
Bei der Suche nach optimierten Berechnungsmöglichkeiten bin ich über die SIMD-Instruktionen (SSE, AVX, usw.) auf Expression Templates gekommen, die im folgenden Link vorgestellt werden.
https://www.grimm-jaud.de/index.php/pri ... -templates
Da dieses Tutorial nun schon einige Jährchen auf dem Buckel hat, frage ich hier die Community: Gibt es in der Zwischenzeit noch effizientere Methoden, die Berechnungen durchzuführen?
Womit müsste man sich beschäftigen, wenn man State-of-the-Art sein möchte?
Viele Grüße,
Lev
C++ Optimieren von Math. Operationen
Re: C++ Optimieren von Math. Operationen
Achja, Möglichkeiten die Abstraktion deart zu gestalten, dass später die Berechnungen konfigurierbar in der CPU, GPU oder APU geschehen können sind natürlich besonders interessant.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C++ Optimieren von Math. Operationen
Ja, da wollte ich eigentlich auch mal wieder rein. ^^
SIMD wird in C++ durch Compilerflags gesteuert, soweit ich weiß. Du musst vorrangig dafür sorgen, dass die Datenpakete gut in den CPU-Cache passen, heißt Vektoren oder Arrays und Zeiger vermeiden (keine Listen, Hashmaps etc).Leverator hat geschrieben: ↑Di Apr 16, 2024 10:46 amBei der Simulation von Neuronalen Netzen werden im Grunde Formeln in der Art Y = ax + b ausgewertet. Wobei wir hier über gigantische Vektoren, Matritzen, bzw. Tensoren sprechen.
Bei der Suche nach optimierten Berechnungsmöglichkeiten bin ich über die SIMD-Instruktionen (SSE, AVX, usw.) auf Expression Templates gekommen, die im folgenden Link vorgestellt werden.
https://www.grimm-jaud.de/index.php/pri ... -templates
Afair wäre es hier interessant, entsprechende Funktionen auszulagern und diese C++-Files SIMD-optimiert zu kompilieren.
Das ist kein qualifizierter Rat aus Erfahrung, das ist gesammeltes Halbwissen.
Grafikkarten sind hier wohl extrem leistungsfähig. Ich bin da aber auch micht mehr auf aktuellem Stand. Das damalige Problem war, dass die Daten auf die Grafikkarte zu schaufeln, was den Geschwindigkeitsvorteil der Graka wieder zunichte machte. Das könnte sich dank modernerer Rechner inzwischen verschoben haben. In beide Richtungen.Leverator hat geschrieben: ↑Di Apr 16, 2024 10:46 amDa dieses Tutorial nun schon einige Jährchen auf dem Buckel hat, frage ich hier die Community: Gibt es in der Zwischenzeit noch effizientere Methoden, die Berechnungen durchzuführen?
Womit müsste man sich beschäftigen, wenn man State-of-the-Art sein möchte?
Es ist jedenfalls ein spannendes Thema.
APU ist CPU+GPU, womit die Auswahl zwischen CPU und GPU am Ende bleibt. CUDA wäre hier das Thema für GPUs, bzw. ROCm für AMD, wobei die inzwischen wohl auch Richtung Cuda gehen.
Solange Du Deine mathematischen Klasse abstrahierst, sollte das kein Problem darstellen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 27
- Registriert: Do Okt 31, 2013 9:03 pm
Re: C++ Optimieren von Math. Operationen
Wenn schon Halbwissen als Ratschläge zugelassen sind, möchte ich noch mein Viertelwissen mit in die Runde werfen :
Falls Compilerflags noch nicht so befriedigende Ergebnisse liefern (was man ja evtl auch bei godbolt.org nachsehen kann) wäre es theoretisch auch noch eine Überlegung wert, die zeitkritischen Routinen mit Assembler zu realisieren. Da kann man ja sehr klar sagen, was man will.
Ich habe beispielsweise kürzlich die handelsübliche Wurzelfunktion mit C getestet und dann mit dem Netwide Assembler exakt das gleiche gerechnet, aber halt mit den xmm-Registern und dem SSE-Befehlssatz, oder wie er gleich heißt, und habe dann wirklich nur die halbe Zeit gebraucht.
/edit : noch eine kleine Portion Achtelswissen dazu : Vor längerer Zeit hab ich mal Benchmarks bei Primzahlenberechnung gemacht und festgestellt, dass es zumindest bei Mehrkernprozessoren in Punkto Geschwindigkeit einen ganz entscheidenden Sprung nach vorne macht, wenn man openmp nutzen kann. (www.openmp.org) . Hier ist halt die Chronologie der Aufgabenverteilung und die anschließende Sortierung der Ergebnisse immer so eine Sache ... aber letztlich sicher einen Versuch wert, wenn man schon mit C arbeitet.
Falls Compilerflags noch nicht so befriedigende Ergebnisse liefern (was man ja evtl auch bei godbolt.org nachsehen kann) wäre es theoretisch auch noch eine Überlegung wert, die zeitkritischen Routinen mit Assembler zu realisieren. Da kann man ja sehr klar sagen, was man will.
Ich habe beispielsweise kürzlich die handelsübliche Wurzelfunktion mit C getestet und dann mit dem Netwide Assembler exakt das gleiche gerechnet, aber halt mit den xmm-Registern und dem SSE-Befehlssatz, oder wie er gleich heißt, und habe dann wirklich nur die halbe Zeit gebraucht.
/edit : noch eine kleine Portion Achtelswissen dazu : Vor längerer Zeit hab ich mal Benchmarks bei Primzahlenberechnung gemacht und festgestellt, dass es zumindest bei Mehrkernprozessoren in Punkto Geschwindigkeit einen ganz entscheidenden Sprung nach vorne macht, wenn man openmp nutzen kann. (www.openmp.org) . Hier ist halt die Chronologie der Aufgabenverteilung und die anschließende Sortierung der Ergebnisse immer so eine Sache ... aber letztlich sicher einen Versuch wert, wenn man schon mit C arbeitet.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C++ Optimieren von Math. Operationen
Wenn man das passend kennzeichnet, dann kann auch lückenhaftes Wissen die relevanten Suchwörter für Google enthalten, die den Fragestellenden weiterbringen.osculumobscenum hat geschrieben: ↑Mo Apr 29, 2024 9:16 pmWenn schon Halbwissen als Ratschläge zugelassen sind, möchte ich noch mein Viertelwissen mit in die Runde werfen :
Und da waren doch nette Suchwörter dabei. Auch wenn man sich möglicherweise erstmal Assembler ansehen muss, aber da kann man mit godbold sich ja auch schonmal "inspirieren" lassen.
Parallelisierung z.B. via OpenMP kann bei großen Matrizen natürlich auch eine massive Beschleunigung bedeuten. Hast Du Sechszehntelkenntnisse darüber, wie OpenMP dann in Assembler realisiert wird?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 27
- Registriert: Do Okt 31, 2013 9:03 pm
Re: C++ Optimieren von Math. Operationen
Da hab ich wohl etwas hoppla-hopp geschrieben.
OpenMP ist nix für Assembler, das würde man dann in C probieren. (Auf deren Homepage steht meines Wissens auch, welche Compiler recht direkt mit OpenMP zusammen arbeiten. Wenn ich mich recht erinnere geht es bei gcc recht einfach, ansonsten halt dort mal nachlesen.)
OpenMP ist nix für Assembler, das würde man dann in C probieren. (Auf deren Homepage steht meines Wissens auch, welche Compiler recht direkt mit OpenMP zusammen arbeiten. Wenn ich mich recht erinnere geht es bei gcc recht einfach, ansonsten halt dort mal nachlesen.)
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: C++ Optimieren von Math. Operationen
Möglicherweise schlecht ausgedrückt... die Frage für mich ist, wie der C-Compiler das in Assembler abbildet.osculumobscenum hat geschrieben: ↑Do Mai 02, 2024 9:29 amDa hab ich wohl etwas hoppla-hopp geschrieben.
OpenMP ist nix für Assembler, das würde man dann in C probieren.
Wünschenswert wäre jetzt die Info gewesen, ob man sich das mit godbolt unterstützt wird. ^^
Ja, das werde ich wohl dann selbst mal ausprobieren.osculumobscenum hat geschrieben: ↑Do Mai 02, 2024 9:29 am(Auf deren Homepage steht meines Wissens auch, welche Compiler recht direkt mit OpenMP zusammen arbeiten. Wenn ich mich recht erinnere geht es bei gcc recht einfach, ansonsten halt dort mal nachlesen.)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: C++ Optimieren von Math. Operationen
Hallo zusammen,
vielen Dank für Eure interessanten Kommentare.
Ich habe gerade noch weitere spannende Seiten zu diesem Thema gefunden, die ich Euch nicht vorenthalten möchte:
FFMPEG & SIMD-Tweaks in Assembler
Diskussion darüber, wie gut die automatischen Optimierungen funktionieren
Viele Grüße,
Lev
vielen Dank für Eure interessanten Kommentare.
Ich habe gerade noch weitere spannende Seiten zu diesem Thema gefunden, die ich Euch nicht vorenthalten möchte:
FFMPEG & SIMD-Tweaks in Assembler
Diskussion darüber, wie gut die automatischen Optimierungen funktionieren
Viele Grüße,
Lev