Blog Alkis Blog #37 - AVX

Incredible Alk

Moderator
Teammitglied
Spätestens seit der Einführung von Intels Haswell und aktuell wieder bei den großen Skylake-X CPUs ist eine Funktion aus vielen Gründen wieder in aller Munde: AVX. Viel wird über diese Funktion diskutiert und noch viel mehr Unsinn ist immer wieder zu lesen im Netz besonders wenn es darum geht, wie die Nutzung von AVX Taktraten und Abwärme von CPUs beeinflusst – wobei nur selten über die resultierende Performance geredet wird, aber dazu später mehr.

Um an der Stelle etwas detaillierter Klarheit zu schaffen was dieses AVX eigentlich tut und warum es so toll oder böse ist baue ich mal wieder eine Wall-of-Text zum verlinken in meine Blogabteilung… also los:

Um zu verstehen, was AVX („Advanced Vector Extensions“) eigentlich ist und warum es einen großen Vorteil bieten kann muss man zunächst grundlegend verstehen was eine CPU im Normalfall so tut. Ich will jetzt nicht auf die ganzen Details eingehen da das den Umfang hier endgültig sprengen würde, daher die Kurzform:

Ein üblicher Befehl an die CPU etwas zu berechnen wird immer in den folgenden vier Schritten abgearbeitet: Fetch-Decode-Execute-Store. Bedeutet vereinfacht, die CPU krallt sich den nächsten Befehl in der Liste (Fetch), sucht die nötigen Daten zur Berechnung zusammen und parkt alles in passenden Bereichen (Decode), führt dann die gewünschte Berechnung aus (Execute) und speichert das Ergebnis der Berechnung wieder in einem Speicherbereich ab (Store).

Nun gibt es einige Anwendungen, in denen es nötig ist, viele gleiche Rechenoperationen mit den immer gleichen Ausgangsdaten zu erledigen. Als Beispiel ein kleiner Ausflug in die Mathematik. Angenommen man hat zwei Matrizen A und B (geordnete Anordnung von (skalaren) Werten in n Zeilen und m Spalten) und möchte die miteinander multiplizieren. Das funktioniert so, dass man komponentenweise die Zahlen der n-ten Zeile von A mit der m-ten Spalte von B multipliziert und die Ergebnisse aufsummiert. Keine Sorge, es reicht zu verstehen, dass eine solche Matrixmultiplikation eine große Anzahl einfacher Grundrechenoperationen ist – man hat beispielsweise 50 Ausgangswerte (zwei 5x5 Matrizen) und muss mit den Zahlen 25 Multiplikationen und 20 Additionen durchführen um das Ergebnis zu erhalten. (Das ist nur ein möglicher Beispielfall zur Veranschaulichung, der rechenaufwand kann je nach Algorithmus und Matrixinhalt stark variieren, genauere Details für mathematisch Interessierte siehe hier: http://www.michaelbiebl.de/files/12_matrizen.pdf)

Eine (idealisierte) CPU muss für diese Berechnung 45 mal ihren oben genannten Zyklus durchlaufen. Immer schauen was ist als nächstes dran, die beiden Zahlen suchen, die miteinander verrechnen und das Ergebnis speichern, dann die nächsten Zahlen usw. bis die errechnete Matrix fertig ist.

Hier kommt AVX ins Spiel. Diese Register machen es möglich, statt einer Berechnung viele gleichzeitig durchzuführen so lange die Ausgangsgrößen die gleichen sind. Sprich die gleiche Aufgabe mit AVX zu berechnen würde bedeuten man speichert Matrix A in einem AVX-Register, ebenso Matrix B und macht statt 45 Schritten nur noch zwei: Ein mal alle Multiplikationen auf einen Schlag und dann alle Additionen auf einen Schlag. Fertig. Diese idealisierte Aufgabe erledigt die gleiche CPU mit AVX um grob den Faktor 20 schneller als konventionell! Ist das nicht fantastisch?

Ist es tatsächlich. Natürlich ist es in der Praxis weitaus weniger extrem mit den Performancevorteilen, da reale Anwendungen nunmal nicht ausschließlich aus Matrixmultiplikationen bestehen. Dennoch ist der Vorteil wenn AVX genutzt werden kann in aller Regel derart groß, dass die entsprechende Anwendung einen ordentlichen Geschwindigkeitszuwachs verzeichnet – je mehr Workload auf AVX sinnvoll anwendbar ist, umso besser… und an der Stelle kommen dann Nachteile ins Spiel, die eigentlich gar keine sind aber von einer großen Menge von Leuten leider als solche interpretiert werden, denn jetzt passiert folgendes.

Hat man eine Anwendung, die prinzipbedingt sehr viele Operationen durchführen muss die gut mit AVX beschleunigt werden können, beispielsweise Hashalgorithmen, Videokompression, Bildbearbeitung, Rendering, FEM-Simulationen, Verschlüsselungen und so weiter (alle diese Anwendungen arbeiten massiv mit Matrizen) werden die einzelnen Berechnungseinheiten in der CPU sehr stark belastet, denn sie können/müssen ja mit AVX immer viele Rechenoperationen gleichzeitig ausführen statt wie üblich alles nacheinander (mit ineffizientem Leerlauf dazwischen…). Das führt in diesen Fällen dazu, dass die Leistungsaufnahme und damit auch Abwärme der CPU stark ansteigen kann und weiterhin dazu, dass die CPU ihren Takt absenken muss um nicht ihre spezifizierten Limits dahingehend zu überschreiten.

Diese Tatsache wird aktuell im Netz immer wieder verschrien, dass die CPUs ja ihre Taktraten nicht halten können, dass sie so heiß werden und so weiter und so fort. Dabei ist genau das der GEWÜNSCHTE ZUSTAND, da die CPU hier viel viel effizienter wird!

Natürlich werden die CPUs bei AVX-Nutzung heißer und brauchen mehr Strom und müssen ggf. zurücktakten – aber sie werden dadurch in einem viel viel größeren Maß schneller! Eine CPU, die eine solche Aufgabe wie oben genannt mit AVX ausführt ist bei 3 GHz deutlich schneller als sie es ohne AVX bei 4 GHz wäre. Um es in den Worten der Foristen auszudrücken damit es jeder versteht: AVX ist eine Möglichkeit, die IPC einer CPU um ggf. mehrere 100% zu steigern im Austausch für ein paar Hundert MHz weniger Takt.

Als AMD mit ihrem neuen Ryzen die IPC um Größenordnung 50% steigern konnte stand das Internet Kopf wegen der ach so massiven Steigerung – bei passenden Anwendungen (beispielsweise dem y-cruncher) steigert AVX(2/512) die IPC der CPU um grob 200-300%! Ohne das in einer Weise wertend zu meinen kann man hier durchaus erwähnen, dass ein System aus 32 Skylake-Kernen mit AVX512-Nutzung rund 30% schneller ist als ein System aus 64 Zen-Kernen – mehr als doppelte Geschwindigkeit bei halbem Stromverbrauch sozusagen.

Leider ist es so, dass es in den Köpfen der meisten User da draußen deutlich wichtiger zu sein scheint, dass CPUZ ihnen 4 GHz bescheinigt als was am ende wirklich an Leistung rumkommt. Persönlich ists mir da lieber, wenn ich meinen Videoclip mit nur 3 GHz in den HEVC komprimieren kann bei AVX-Nutzung, damit aber 30% schneller bin als der Kollege mit der gleichen CPU, der seine 4 GHz hat und AVX nicht benutzt.

Extrem wird es dann, wenn für solche (Takt-)Vergleiche (im Heimbereich sinnloserweise) Prime95 oder LinX angeführt wird. Die Suche nach Mersenne-Primzahlen ist mathematisch gesehen nur eine endlose Folge von Fourier-Transformationen und LinX macht Determinantenbestimmungen von riesigen Gleichungssystemen. Das sind nun blöderweise bzw. günstigerweise je nach Standpunkt mathematische Dinge, die super mit Tonnenweise an Vektorberechnungen erledigt werden können und auch entsprechend super mit AVX beschleunigt werden können – gerade bei kleinen FFT-Längen wo Zahlen auch noch komplett in die Register passen und wenig nachgeladen werden muss. Resultat ist, dass die CPU extrem effizient und irre schnell wird… nur sieht der Nutzer das nicht in Prime, jedenfalls nicht im Stabilitätstest (beim Benchmark dagegen schon!). Der sieht nur dass die CPU heiß wird und ihren Takt senkt – auf die Idee, dass sie dabei weitaus schneller und effizienter ist als ohne AVX und bei doppeltem Takt kommt er nicht.

Noch „schlimmer“ wird die Sache dadurch dass Intel AVX auch immer mächtiger implementiert, einfach WEIL die Funktion derart viel Leistungspotential hat. Mittlerweile sind die Einheiten auf 32 Register mit 512bit Breite angewachsen („AVX512“) was schon ein echtes Pfund ist und den momentan kaufbaren 10-kerner Skylake zu rund einem Teraflop an Leistung verhelfen kann bei günstigem Code - zum Vergleich: Ohne AVX-Nutzung bewegt sich die gleiche CPU je nachdem was man berechnet zwischen 20 und 200 GFlops, über den ganz dicken Daumen ist AVX512 hier in der theoretischen Rechenleistung um Faktor 10 schneller als konventionelles rechnen!

So viel Fortschritt in IPC, Geschwindigkeit und Effizienz wurde an diesen Stellen erreicht und die einzigen Probleme die die Leute da draußen haben ist wenn die CPU deswegen 500 MHz niedriger läuft und die Zahl nicht mehr so schön aussieht. Dabei ist die Taktreduktion auch noch dynamisch und passt sich sowohl der Art des Codes (kein AVX/AVX1/AVX2/AVX512) sowie der entstehenden Last bzw. Menge an entsprechenden Befehlen an. Anders gesagt es hat auch noch niemand einen Nachteil – wird kein oder nur sehr wenig AVX genutzt (etwa in Spielen) taktet die CPU voll durch, wird AVX genutzt in passenden Anwendungen wird der Takt ggf. abgesenkt, die CPU aber massiv schneller. Wo in aller Welt ist also das Problem? Sind die „Männer, die auf Taktraten starren“ wirklich derart in der Überzahl dass man es als Nachteil im Netz anerkennt, wenn eine CPU ihre Leistung verdoppelt und verdreifacht nur weil dafür 500 MHz weichen müssen? Schade eigentlich.


Nachtrag: AVX512 in der Praxis:
skl_vs_bdw_speedup.png

AVX512 bringt je nach Codec und Einstellungen beim Videoencodieren in der realen Praxis über 50% (!!) Mehrleistung!
 
Sehr schön...auch wenn ich beim ersten lesen nur die Hälfte verstehe:huh:..dann halt noch ein zweites mal lesen :)

So oder so, dein Blog gefällt mir:daumen:
 
Schöner Blogeintrag!

Hier kann man auch wieder mal einen Autovergleich ziehen, der imho aber ganz gut passt. Der Takt einer CPU ist wie die Motordrehzal, das was beim Autofahren relevant ist, ist aber die erzielte Geschwindigkeit und nicht die Drehzahl. Hier kommt dann die Gangschaltung des Autos zum tragen: Ich kann tolle 7.000 U/min auf dem Drehzahlmesser haben und damit im ersten Gang aber nur 50 km/h fahren oder mit gemütlichen 3.000 U/min mit 150 km/h im fünften Gang auf der Autobahn dahingleiten und damit die dreifache Strecke zurücklegen. Befehlssatzerweiterungen wie AVX sind wie die einzelnen Gänge zu sehen.

Es kommt eben letztendlich nicht auf den Takt bzw. die Drehzahl an sondern darauf wieviele Rechenopertionen bzw. wie viel Weg ich pro Takt bzw. U/min schaffe, eben was am Ende an Leistung hinten rauskommt.

Der Vergleich passt übrigens auch was Effizienz betrifft. Legt man im Auto im niedrigen gang eine Strecke langsam zurück und die selbe Strecke im hohen Gang schnell dann hat man in der Momenaufnahme das Gefühl bei schnellerem Fahren mehr zu verbrauchen, vergleicht man aber objektiv wird man sehen dass man sowohl viel schneller am Ziel ist aber auch weniger Treibstoff für die Strecke verbraucht zu haben.
 
Passt tatsächlich ganz gut - bei Autovergleichen bin ich aber immer sehr vorsichtig - einfach weil zwingend irgendwas immer nicht passt und sich dann genau da viele Leute dran aufhalten/stören. Gut, dass das hier ein Blog ist, da ist der Durchgangsverkehr bedeutend kleiner bzw. das hier lesen onehin nur Leute die sich für genau das Thema/Detail interessieren. :D
 
Alk, wie sieht das aus, wenn eine CPU-Kern AVX512 verarbeitet, kann dieser auch noch "normale Befehle" parallel bearbeiten? Und solche Arbeit ist doch klassisch GPU-Arbeit. Also Matrixmultiplikation u.ä. Welchen Vorteil bietet es wenn eine CPU sowas jetzt besser kann? Weil so parallelisiert wie eine GPU ist das doch lange noch nicht.

Außerdem wie kommst du bei einer Matrixmultiplikation von zwei 5x5 Matrizen auf 45 Operationen? Das Ergebnis ist ja auch eine 5x5 Matrix, und für jeden der 25 Einträge der Matrix muss man 5 Multiplikationen und vier Additionen durchführen. So komme ich auf insgesamt 25 * 9 = 225 notwendig Rechenoperationen. Oder übersehe ich hier was?

Auf Twitter meinte Intels ehemaliger Chefingenieur @FPiednoel sinngemäß, dass Intel dank AVX512 meilenweit schneller sei als Threadripper und dass das ja so verkannt sei. Ich wundere mich nun, kann AMD nicht theoretisch für solche Rechenwerke auf Radeon-IP zurückgreifen? Das müsste doch für die GPUs gelöst worden sein, zumindest so ungefähr, oder?

Es ist cool, wenn jemand wie du für weniger versierte Leute sowas, gut erklären kann.

Danke für den Post
 
Hatte mir auch schon überlegt, über das Thema einen Post zu machen. Allerdings eher wegen der News, dass Intel evtl. MMX abschaffen will und die meisten Forennutzer in den Kommentaren irgendwas in der Richtung "Altlasten raus, die bremsen nur" geschrien haben. Ohne zu wissen, was das Ding eigentlich macht :wall:
 
@costa: Ja, das geht parallel, nur weil eine CPU einen AVX512-Befehl ausführt bedeutet das nicht dass alles andere stehen bleibt (nur genau die beteiligten Einheiten können natürlich nichts anderes machen).

Was die Rechenschritte angeht hast du Recht, das können je nach verwendetem Algorithmus und Matritzenwerten durchaus mehr oder weniger sein, da hatte ich nicht weit genug ins Detail geschaut (ich muss das alles auch immer nachschauen, meine letzte Mathevorlesung ist schon viele Jahre her^^). Für mathematisch interessierte hier die Detailform: http://www.michaelbiebl.de/files/12_matrizen.pdf

Inwiefern AMD das GPU-technisch lösen kann weiß ich nicht, das Ding ist, dass AVX in seinen Versionen ein genormter Standard ist den Ryzen und die GPUs nunmal nicht "verstehen". AMD müsste hier entsprechende Schaltkreise in Hardware einsetzen wo Intel als Patenthalter natürlich was dagegen hat (deswegen hängt AMD da immer hinterher in den AVX-Versionen...) - oder sie müssten selbst eine SIMD-Erweiterung dahingehend entwickeln wie es damals beispielsweise "3DNow" war von AMD. Nur ist das für die extrem schwierig - wenn man kaum Marktanteile hat wird sich ein eigener Standard nunmal nicht durchsetzen.
 
Super Blogs!
Ich finde es auch gut das du dir die Mühe machst komplizierte Themen einfach aufzubereiten. Jetzt habe ich tatsächlich alle Blogs über 3 Tage verteilt gelesen, was teilweise schwierig war, allerdings durch deinen Humor doch sehr erleichtert wurde:)
 
Schön geschrieben, eine Anmerkung lass ich trotzdem mal stehen.

Du kannst dir bestimmt schon denken was jetzt folgt. :ugly:

Da du ja mehrfach auf die "Männer, die auf Taktraten starren" zu sprechen kommst und das den gewaltigen Performancegewinnen unter AVX gegenüber stellst, sollte man fairer Weise auch erwähnen wo AVX derzeit eine untergeordnete Rolle spielt, nämlich in Spielen.

;) <-Link (aus 2014, jaaaa ich weiß)

Demnach gibt es also auch Gründe sein Prozessor für ein NON-AVX Szenario zu optimieren und die Leistung der CPU über den Takt zu steigern.

Ich schätze mal grobe 2/3 hier im Forum haben den Fokus bei ihrer Hardware trotz aller "Kaufargumente" primär aufs Spielen ausgelegt.

Das andere Drittel bezieht seine Infos doch meist noch aus ganz anderen Quellen, die ihre "speziellen" Anforderungen/ Software behandeln. (Video, Audio, etc...)

Threads zu solchen "Spezialgebieten" gibt's ja auch im PCGH Forum und genau da kann man dann auch so Argumentieren (AVX > Takt), für die breite Masse trifft es aber eben weitaus seltener zu.

Darum sollte man da wirklich klar differenzieren wofür man die Hardware nutzt und schauen ob AVX da überhaupt eine Bedeutung hat, wenn nicht ließe man ohne gesteigerte Taktraten auch nur Leistung brach liegen und das war ja sicher nicht Ziel des Blogeintrags.

Grüße :daumen:
 
Zurück