12 Punkte von GN⁺ 2024-11-06 | 6 Kommentare | Auf WhatsApp teilen
  • Moderne Hochsprachen und fortschrittliche Compiler vereinfachen die Softwareentwicklung erheblich und senken die Kosten, neigen aber aufgrund ineffizienter APIs dazu, die Leistungsmerkmale moderner Hardware zu verbergen
  • Laut den FFmpeg-Entwicklern kann der Einsatz von Assembly-Code je nach Workload die Performance um das 3- bis 94-Fache steigern
  • Um bestimmte Funktionen in FFmpeg zu beschleunigen, wurden optimierte Codepfade mit dem AVX-512-Befehlssatz erstellt, wodurch im Vergleich zur Standardimplementierung eine deutlich höhere Performance erzielt werden konnte
  • AVX-512 verwendet 512-Bit-Register und kann in einer einzelnen Operation 16 Single-Precision-FLOPs oder 8 Double-Precision-FLOPs verarbeiten, was die parallele Verarbeitung großer Datenmengen ermöglicht
  • Benchmark-Ergebnisse zeigen, dass der neue handgeschriebene AVX-512-Codepfad deutlich schneller ist als die Referenz in C und andere Implementierungen mit kleineren SIMD-Befehlssätzen wie AVX2 und SSE3
  • Diese Entwicklung ist besonders nützlich für Nutzer, die auf Hardware mit AVX-512-Unterstützung arbeiten, da sich Medieninhalte damit wesentlich effizienter verarbeiten lassen
  • Allerdings hat Intel AVX-512 in Core-Prozessoren der 12., 13. und 14. Generation deaktiviert, sodass Besitzer dieser CPUs es nicht nutzen können
  • AMDs CPUs der Ryzen-9000-Serie verfügen dagegen über eine vollständig aktivierte AVX-512-FPU, sodass Besitzer dieser Prozessoren von den Verbesserungen in FFmpeg profitieren können
  • Wegen der Komplexität und Spezialisierung von AVX-512 bleiben solche Optimierungen leider meist auf performancekritische Anwendungen beschränkt und erfordern Fachwissen in Low-Level-Programmierung und Prozessor-Mikroarchitektur
    ( Dieser Inhalt stammt aus Tom's Hardware: FFmpeg devs boast of up to 94x performance boost after implementing handwritten AVX-512 assembly code )

6 Kommentare

 
gurugio 2024-11-08

Ich habe früher kurz an ähnlichen Arbeiten mitgewirkt, daher dazu ein paar Worte: Diese 94 sind zunächst einmal Clickbait.
Wie in den Kommentaren bereits gesagt wurde, ist der große Leistungsunterschied auf den Unterschied zwischen Skalar- und Vektor-Code zurückzuführen.
Die meisten kommerziellen Codecs werden jedoch per Assembler-Coding optimiert.
„Der Großteil von C-Code wird zu optimalem Assembler-Code kompiliert“ ist zwar grundsätzlich richtig, aber um ein kommerzielles Produkt zu entwickeln, muss man über dieses Niveau hinausgehen. Besonders im Embedded-Bereich ist das noch wichtiger.

 
GN⁺ 2024-11-06
Hacker-News-Kommentare
  • Die Behauptung, dass sich die Leistung bei einem bestimmten Filter von FFmpeg um das 94-Fache verbessert habe, ist irreführend. Die meisten Nutzer verwendeten bereits AVX/SSE, daher war keine Optimierung des C-Codes erforderlich.
    • Die Hauptlast auf der CPU in FFmpeg entsteht beim Kodieren und Dekodieren, und diese Verbesserung hat darauf keinen Einfluss.
  • Dies ist kein Vergleich zwischen handgeschriebenem Assembler und nicht handgeschriebenem Code, sondern zwischen skalarem Code und Vektorcode.
    • Wenn man C-Code mit AVX-Intrinsics schreibt, lassen sich auch ohne Assembler ähnliche Geschwindigkeitsgewinne erzielen.
  • In bestimmten Fällen kann handgeschriebener Assembler von Vorteil sein.
    • Video-Decoder enthalten sehr enge Schleifen, daher ist Assembler nötig, um eine konsistente Performance aufrechtzuerhalten.
  • Das FFmpeg-Team untersagt die Verwendung von Intrinsics und verlangt, dass aller plattformspezifische Code in Assembler geschrieben wird.
    • Assembler ist mit genügend Aufwand immer schneller, aber mit Intrinsics lässt sich mit deutlich weniger Aufwand eine sehr ähnliche Performance erreichen.
  • Die 94-fache Verbesserung ist eine Optimierung von dav1d und kann nicht nur in FFmpeg, sondern auch in anderen Programmen genutzt werden.
    • Es gibt eine Anfrage nach Optimierungen für RISC-V (64-Bit), was eine gute Gelegenheit für Interessierte ist.
  • Mike Pall von LuaJIT hat einmal die Vorteile des Schreibens von Assembler erklärt.
  • In einem Mikrobenchmark wurde eine einzelne Funktion 94-mal schneller als der C-Code.
  • Intel hat AVX-512 in Prozessoren der Core-Generationen 12, 13 und 14 deaktiviert.
    • Einen klaren Grund dafür konnte man nicht finden.
  • Vor der Behebung von Performance-Problemen wird oft nicht ausreichend daran gearbeitet, den Flaschenhals zu identifizieren.
    • Der meiste C-Code wird zu optimalem Assembler kompiliert.
  • Der Grund für den Performance-Gewinn ist nicht handgeschriebener Assembler, sondern die Verwendung von AVX-512-SIMD-Befehlen.
    • Ich würde das gern mit der AVX-512-Vektorisierung von gcc vergleichen.
 
maclier 2024-11-06

Neue Intel-Downfall-Sicherheitslücke bei AVX2/AVX-512 und ihre enormen Auswirkungen auf die Leistung

https://tuxcare.com/ko/blog/…

 
cosine20 2024-11-08

Ah, aus diesem Grund hat Intel AVX-512 also abgeschafft.

 
shlee1503 2024-11-10

Soweit ich weiß, liegt es weniger an diesem Grund, sondern daran, dass die E-Cores AVX-512 nicht unterstützen und es deshalb softwareseitig deaktiviert wurde.
Die P-Cores unterstützten AVX-512 inoffiziell.

 
cosine20 2024-11-11

Ach so. Danke für den Hinweis :)