C++ Optimieren von Math. Operationen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Leverator
Beiträge: 34
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

C++ Optimieren von Math. Operationen

Beitrag von Leverator » Di Apr 16, 2024 10:46 am

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

Leverator
Beiträge: 34
Registriert: Mo Jan 30, 2012 9:28 pm
Wohnort: ::1

Re: C++ Optimieren von Math. Operationen

Beitrag von Leverator » Di Apr 16, 2024 10:47 am

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C++ Optimieren von Math. Operationen

Beitrag von Xin » Di Apr 16, 2024 11:44 am

Leverator hat geschrieben:
Di Apr 16, 2024 10:46 am
Hallo zusammen,
ich interessiere mich auf sehr grundlegendem Level für KI (NN) und allgemeiner Signalverarbeitung.
Ja, da wollte ich eigentlich auch mal wieder rein. ^^
Leverator hat geschrieben:
Di Apr 16, 2024 10:46 am
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
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).

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.
Leverator hat geschrieben:
Di Apr 16, 2024 10:46 am
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?
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.

Es ist jedenfalls ein spannendes Thema.
Leverator hat geschrieben:
Di Apr 16, 2024 10:47 am
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.
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.

osculumobscenum
Beiträge: 26
Registriert: Do Okt 31, 2013 9:03 pm

Re: C++ Optimieren von Math. Operationen

Beitrag von osculumobscenum » Mo Apr 29, 2024 9:16 pm

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.

Antworten