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:
AVX512 bringt je nach Codec und Einstellungen beim Videoencodieren in der realen Praxis über 50% (!!) Mehrleistung!
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:
AVX512 bringt je nach Codec und Einstellungen beim Videoencodieren in der realen Praxis über 50% (!!) Mehrleistung!