Ich dachte, diese Frage wird im CS-Teil von Stack Exchange besser beantwortet. Haben die Multimedia-SIMD-Erweiterungen (SSE / AVX / NEON) nach GPGPUs mit Sprachen wie CUDA und OpenCL noch einen Zweck?
Ich habe kürzlich einen Artikel darüber gelesen, wie SSE-Anweisungen verwendet werden können, um das Sortieren von Netzwerken zu beschleunigen. Ich fand das ziemlich ordentlich, aber als ich meinem Comp-Arch-Professor sagte, lachte er und sagte, dass das Ausführen von ähnlichem Code auf einer GPU die SIMD-Version zerstören würde. Ich bezweifle dies nicht, da SSE sehr einfach ist und GPUs große, hochkomplexe Beschleuniger mit viel mehr Parallelität sind, aber ich dachte, gibt es viele Szenarien, in denen die Multimedia-SIMD-Erweiterungen nützlicher sind als die Verwendung einer GPU?
Wenn GPGPUs SIMD überflüssig machen, warum sollte Intel dann die SIMD-Unterstützung erhöhen? SSE war 128 Bit, jetzt sind es 256 Bit mit AVX und nächstes Jahr werden es 512 Bit sein. Wenn GPGPUs Code mit Datenparallelität besser verarbeiten, warum drängt Intel diese SIMD-Erweiterungen? Sie sind möglicherweise in der Lage, die entsprechenden Ressourcen (Forschung und Bereich) in einen größeren Cache- und Zweigprädiktor zu integrieren, wodurch die serielle Leistung verbessert wird.
Warum SIMD anstelle von GPGPUs verwenden?
quelle
Antworten:
Nichts ist umsonst. GPGPUs sind SIMD. Die SIMD-Anweisungen auf GPGPUs sind tendenziell breiter als die SIMD-Anweisungen auf CPUs. GPGPUs sind in der Regel feinkörnig mit mehreren Threads (und haben viel mehr Hardwarekontexte als CPUs). GPGPUs sind für das Streaming optimiert . Sie neigen dazu, einen größeren Prozentsatz der Fläche für Gleitkommaeinheiten, einen geringeren Prozentsatz der Fläche für den Cache und einen geringeren Prozentsatz der Fläche für die Ganzzahlleistung bereitzustellen.
Lassen Sie uns einen Vergleich machen. Intels Core i7-5960x verfügt über 8 Kerne mit jeweils 4-fach (doppelter Genauigkeit) SIMD, die mit 3 GHz (3,5 GHz Turbo), einem 20M L3-Cache, 356 mm ^ 2 und 140 W betrieben werden und 1000 US-Dollar kosten . Also 8 * 4 * 3 * 4 = 384 GFlops mit doppelter Genauigkeit. (Das zusätzliche 4x ist darauf zurückzuführen, dass Sie pro Vektorspur und Zyklus zwei Fused-Multiplly-Adds ausführen können.) Es können 768 GFlops mit einfacher Genauigkeit ausgeführt werden. Das sind ungefähr 1,08 DP GFlops / mm ^ 2 und 2,75 DP GFlops / Watt. Es gibt auch ungefähr 57,5 KB / mm ^ 2 On-Chip-Cache.
Die GeForce GTX Titan Black von NVidia verfügt über 15 SMXs mit jeweils 32 SIMD-Karten mit doppelter Genauigkeit, 890 MHz (980 MHz Turbo), 3,5 MB L1 + L2-Cache, 561 mm ^ 2, 250 W und 1000 US-Dollar . Also 15 * 32 * .89 * 4 = 1709 GFlops mit doppelter Genauigkeit. (Gleiches 4x aus zwei fusionierten Multiplikationsadditionen pro Vektorspur pro Zyklus.) Es können 5126 GFlops mit einfacher Genauigkeit ausgeführt werden. Das sind ungefähr 3,05 DP GFlops / mm ^ 2 und 6,8 DP GFlops / Watt. Also 3x die DP-Gleitkommadichte pro Flächeneinheit und 3x die DP-Gleitkomma-Energieeffizienz. Und der Kompromiss? 6,4 KB / mm ^ 2 On-Chip-Cache. Etwa 9x weniger dicht als die CPU.
Der Hauptunterschied besteht also darin, dass die GPU eine Flächenbalance gewählt hat, die Gleitkomma (und insbesondere Gleitkomma mit einfacher Genauigkeit) gegenüber Cache stark bevorzugt. Selbst wenn Sie die Tatsache ignorieren, dass Sie zwischen der CPU und der GPU hin und her kopieren müssen, um E / A auszuführen, hängt es von dem Programm ab, das Sie ausführen, wie gut die GPU im Vergleich zur CPU funktioniert.
Wenn Sie ein datenparalleles Gleitkommaprogramm mit sehr geringer Steuerungsdivergenz haben (alle Vektorspuren tun zur gleichen Zeit dasselbe) und Ihr Programm streamen kann (kann nicht vom Caching profitieren), dann ist die GPU ungefähr 3x effizienter pro Flächeneinheit oder pro Watt. Wenn Sie jedoch ein erhebliches Maß an divergenter Kontrolle haben, nicht datenparallel arbeiten müssen oder von großen Datenstrukturen mit vielen Lesevorgängen profitieren könnten, wird die CPU wahrscheinlich besser abschneiden.
quelle