Frage

Ich bin mit SSE-Erweiterungen in Core2Duo Prozessor (Compiler gcc 4.4.1). Ich sehe, dass es 16 Register zur Verfügung, von denen jede 128 Bit lang ist. Jetzt kann ich 4 ganzzahlige Werte in ein einzelnes Register aufzunehmen, und 4 in einem anderen Register und mit Hilfe intrinsics ich sie in einem Befehl hinzugefügt werden kann. Der offensichtliche Vorteil ist diese Weise, die ich benötigen nur 1 Anweisung statt 4.

Meine Frage ist „ist, dass alle für SIMD?“. Lasse Ich habe a1, a2, a3, a4, a5, a6, a7, a8 und b1, b2, b3, b4, b5, b6, b7, b8. Sei A1, A2 sind Vektorregister. Nun A1 <<< (a1, a2, a3, a4) und B1 <<< (b1, b2, b3, b4) und add (A1, B1) werden die Vektoraddition durchzuführen.

Let A2 <<< (a5, a6, a7, a8), B2 <<< (b5, b6, b7, b8). Gibt es eine Add-Instruktion, die Add tun kann (A1, B1) und fügen Sie (A2, B2) gleichzeitig.

Wie viele funktionelle Vektoreinheiten sind in core2duo und wo kann ich diese Informationen bekommen?

Eine andere Quelle von Informationen im Zusammenhang mit diesem sehr geschätzt.

War es hilfreich?

Lösung

  • Nein, es gibt keine einzige Anweisung SSE, das zu tun. Sie benötigen zwei Weisungen zu erteilen. Denken Sie an so etwas wie die x86-String Anweisungen und der REP-Präfix? Es gibt keine SSE-Äquivalent.

  • Die beiden 4-breite Vektoroperationen wird concerrently im Sinne ausgeführt werden, dass alle modernen Prozessoren sehr pipelined werden. Der zweite Befehl wird das Rohr nur 1 Zyklus hinter dem ersten (vorausgesetzt, die beide sind nicht voneinander abhängig, was der Fall in Ihrem Beispiel ist) nach unten gehen, so dass ihre Ausführung in der Zeit überlappt, mit Ausnahme, dass ein Zyklus.

  • Jeder Kern Ihres Multi-Core-Prozessor verfügt über einen eigenen Vektor-Funktionseinheit. Sie haben Multi-Threaded-Code zu schreiben, diesen Vorteil zu nehmen.

  • Einige CPUs haben 1 Vektoreinheit pro Kern, einige haben nur 1/2! Im letzteren Fall ist die Vektoreinheit nur 64-Bit breit und nur ausführt, eine Hälfte des SSE Befehls gleichzeitig. Sie bekommen, was Sie bezahlen.

  • Sie sollten in AVX aussehen, die neue Befehlssatzerweiterung dass SSE entwickelt ich breite Vektoreinheiten zu unterstützen.

  • Oder Sie in reale Vektorprogrammierung auf einer GPU mit OpenCL oder Cuda aussehen könnten.

Andere Tipps

Ich glaube nicht, dass es eine einzige Anweisung, dies zu tun (es sei denn sie ein in eine aktuellere Version von SSE schlich).

Da jedoch die Operationen, die Sie tun, unabhängig sind, kann der Compiler den zweiten Additionsbefehl, bevor die ersten Oberflächen ausstellen. So ist die Zeitleiste so etwas wie

aussehen würde
begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

Auch wenn Sie also zwei Befehle verwenden, sind Sie nicht unbedingt die doppelte Zeit. Die tatsächliche Dauer der Wartezeit wird auf dem Prozessor abhängen und die Latenzzeit des speziellen Befehls, dass Sie verwenden.

Hier ist eine ausführlichere Erklärung des Pipelining: http://en.wikipedia.org/wiki/Instruction_pipeline

Wenn Sie Hilfe zu SIMD-Programmierung im Allgemeinen Apple SSE ist ziemlich gut. Es ist etwas gegenüber den Menschen ausgerichtet Anwendungen von PowerPC auf SSE migrieren, aber es gibt einige gute allgemeine Informationen auch dort.

Die Intel-Website enthält alle Informationen, die Sie jemals brauchen werden!

http://www.intel.com/products/processor/manuals/

In Antwort auf den Kommentar: Die Info ist in den Links zu allen Inhalten aller gelinkten oben, aber Nein, Sie 8 16-Bit-Integer in-1-Register packen konnte, und führen somit 8 gleichzeitige fügt aber keine SSE erlaubt keine Zugabe von 2 Registern gleichzeitig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top