Warum SIMD verwenden, wenn wir GPGPU haben?

13

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?

Jonfrazen
quelle
2
Es ist an sich schon eine Herausforderung, die GPU mit genügend Daten zu versorgen, um sie beschäftigt zu halten. Die Datenübertragung zwischen Host und Gerät ist praktisch immer der Engpass. Bestimmte Operationen werden auf CPUs besser unterstützt (z. B. Carry-Free-Multiplikation; siehe PCLMULQDQ).
Juho
2
@Juho Haben nicht neue Geräte wie AMDs APUs die GPU und die CPU auf demselben Chip? Beseitigt dies den Engpass?
Jonfrazen
1
Wenn alles gesagt und getan ist, ist ein Vektorbefehl immer noch ein einzelner Befehl, und die Kosten für das Planen und Ausführen sind die gleichen wie für jeden anderen einzelnen Befehl. Es ist nur dann sinnvoll, Jobs auf der GPU auszuführen, wenn der Nutzen die Kosten überwiegt. Beachten Sie auch, dass Sie eine SIMD-Einheit pro Kern erhalten, normalerweise jedoch nur eine GPU pro Gehäuse, und die GPU derzeit eine gemeinsam genutzte Ressource ist. Dies begrenzt die Anzahl der Jobs, die Sie auf einer GPU ausführen können. (Die Anzahl der Kerne nimmt ständig zu, die Anzahl der GPUs jedoch nicht.)
Pseudonym
Intel macht nicht viel in Bezug auf GPUs (abgesehen von Larrabee / Knights Landing :)), daher denke ich, dass es für sie selbstverständlich ist, stattdessen zu versuchen, AVX zu pushen. Obwohl die starke Nutzung von AVX sehr leistungsfähig sein kann, führt dies jetzt zu einem Downclocking auf den neueren CPUs, sodass sie möglicherweise mit etwas an ihre Grenzen stoßen.
Nsandersen

Antworten:

16

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.

Wanderlogik
quelle