Was ist der Unterschied zwischen einem Superskalar- und einem Vektorprozessor?

4219
Luke

Beide können mehrere Anweisungen gleichzeitig verarbeiten, aber ich denke, es gibt einen grundlegenden Unterschied, der erklärt, warum es zwei Namen gibt und wir nicht immer auf Superskalare umgestellt haben.

Wenn ich es richtig verstanden habe, sind sowohl Skalar- als auch Vektoranweisungen in einer modernen CPU vorhanden. Ich nehme an, dass sich diese beiden nicht gegenseitig ausschließen (Skalaranweisungen wie mov oder add werden superskalar ausgeführt, und beispielsweise wird ein Punktprodukt vektor berechnet -ly auf eine besondere Art von schwarzer Magie)?

7
In Anbetracht des Downvotes und der Closevote wäre eine Erklärung willkommen. Es scheint mir, dass die Frage spezifisch und klar genug ist, und eine echte Frage, die ich in Bezug auf Software oder Hardware gemäß den Richtlinien angetroffen habe. Luke vor 7 Jahren 1

2 Antworten auf die Frage

2
bwDraco

Ein superskalarer Prozessor kann mehrere Anweisungen in einem einzigen Programm parallel ausführen. Dies geschieht durch Analysieren des Befehlsstroms, um zu bestimmen, welche Befehle nicht voneinander abhängig sind, und mehrere Ausführungseinheiten innerhalb des Prozessors haben, um die Arbeit gleichzeitig auszuführen (z . B. mehrere ALUs ). Compiler-Unterstützung ist im Allgemeinen nicht erforderlich, um Code für superskalare Prozessoren zu optimieren, da die Funktionalität normalerweise vollständig in Hardware implementiert ist. 1

Ein Vektorprozessor enthält Anweisungen, die speziell dafür ausgelegt sind, ganze Gruppen mehrerer Datenwerte gleichzeitig zu bearbeiten (als Arrays oder Vektoren bezeichnet ). Die meisten modernen Hochleistungsprozessoren verfügen über eine Form der Vektorverarbeitung. zum Beispiel; Der in den meisten x86-Prozessoren verfügbare SSE- ADDPS Befehl berechnet die Summe von zwei Vektoren, die jeweils vier Werte mit einfacher Genauigkeit enthalten. Die Unterstützung von Compilern, Entwicklern und Betriebssystemen ist in der Regel für die Verwendung von Vektoranweisungen erforderlich, und nicht jeder Prozessor unterstützt auch in aktuellen Generationen die fortschrittlichsten Vektoranweisungen (z. B. unterstützen Intel Celeron- und Pentium-Prozessoren auch von Kaby Lake nicht AVX.) ).

In dieser Antwort finden Sie weitere technische Informationen darüber, wie die heutigen Prozessoren eine hohe Leistung erzielen .


1 Ein alternativer und eher ungewöhnlicher Entwurfsansatz besteht darin, über mehrere Ausführungseinheiten zu verfügen, der Compiler kann jedoch bestimmen, welche Anweisungen für jede Takteinheit an jede Ausführungseinheit ausgegeben werden sollen. Dies wird als sehr langes Befehlswort bezeichnet und wird normalerweise nur von spezialisierten Prozessoren gefunden.

0
Luke

Da niemand eine Antwort gefunden hat, denke ich, ich habe es inzwischen herausgefunden.

Ein Skalarprozessor ist nur ein regulärer Prozessor, der Skalaranweisungen ausführt, die jeweils mit einer Nummer arbeiten. Nichts Besonderes.

Der Vektorprozessor auf der anderen Seite verwendet Vektorbefehle, die gleichzeitig mit mehreren Zahlen arbeiten sollen. Zu diesem Zweck gibt es spezielle, breitere Register (z. B. 128-Bit xmm * von SSE, in die mehrere Werte gepackt werden können, z. B. 4 32-Bit-Ganzzahlen; AVX-512 führt 512-Bit-Register ein, die das breiteste I sind konnte finden). Vektoroperationen werden von speziellen Einheiten im Prozessor ausgeführt, die zu diesem Zweck hergestellt werden. Ein typisches Beispiel für einen Vektorprozessor wäre GPU - er führt nur Vektorberechnungen aus.

Superskalar ist der Begriff, der verwendet wird, um eine spezifische Optimierung zu bezeichnen, mit der skalare Anweisungen parallel auf verschiedenen "regulären" Ausführungseinheiten (z. B. mehreren ALUs) ausgeführt werden können. Es teilt die Anweisungen in mehrere "Streams" auf (ich habe diesen Begriff gerade gemacht), die dann gleichzeitig ausgeführt werden.

Wie unterscheiden sie sich von ihren Vektor-Gegenstücken? Skalare Anweisungen sollen nicht auf diese Weise ausgeführt werden . Es gibt mehrere mögliche Gefahren, die auftreten können und die eine vollständige parallele Ausführung verhindern, z. B. Daten oder prozessuale Abhängigkeiten. In diesem Fall müsste die Ausführung dieser Anweisung warten, bis ihre Abhängigkeiten erfüllt sind, wodurch die Ausführung dieses "Stroms" unterbrochen wird. Die CPU muss sich um alle Abhängigkeiten kümmern, um Datenverfälschungen zu vermeiden. Daher ist besondere Vorsicht bei der Optimierung der Ausführung auf diese Weise erforderlich.

Es führt auch keine neuen Anweisungen ein - alles sieht nur aus wie eine normale Skalar-CPU-Operation. Auf der anderen Seite haben Vektor-CPUs spezielle Anweisungen für Vektoroperationen. Der Hauptunterschied besteht darin, dass sich der Programmierer (oder vielmehr der Compiler) für die Vektoroperationen um die Daten kümmern muss und weil es keine gleichzeitige Einmischung in verschiedene Register gibt (denken Sie daran, dass alle Werte in Wide-Register gepackt werden), verschiedene Gefahren vermieden werden. Superskalare CPUs geben ihr Bestes, um herauszufinden, welche Befehle voneinander unabhängig sind, und sie gleichzeitig auszuführen.


Beachten Sie, dass ich nie gesagt habe, dass sich Kategorien ausschließen. Sie sind nicht Vektoreinheiten führen Vektoranweisungen aus, und die CPU wird versuchen, die beste Möglichkeit zur Parallelisierung von skalaren Anweisungen zu finden. Tatsächlich unterstützen alle modernen CPUs sowohl Vektoranweisungen (SSE *, 3DNow !, AVX, ...) als auch skalare (x86), die "superskalar" ausgeführt werden.

Große Erklärung. Nach dem vollständigen Verständnis Ihrer Erklärung ist meine Frage: Wenn der Prozess superskalare Anweisungen unterstützt, wie kann ich sicherstellen, dass mein C-Programm superskalare Anweisungen verwendet, wenn ich zum Beispiel eine Matrixmultiplikation mache? Wird vom Compiler etwas getan, wenn superskalare Anweisungen unterstützt werden? Whoami vor 5 Jahren 0