Warum separate Gleitkommaregister Intel x64-Prozessoren

832
Bulat M.

Warum gibt es separate Gleitkommaregister xmm0-xmm15in Intel x64- CPUs?

Ich weiß xmm, es wird auch für Vektoroperationen verwendet, bei denen ein Befehl (SSE *) auf mehreren Nummern in einem Register ausgeführt wird. Abgesehen davon, warum sollte man xmm0- xmm15Register anstelle von Allzweck-Registern verwenden: rax, rbx, rcx, rdx, rbp, rsp, rdi, rsi-r8-r15?

2

1 Antwort auf die Frage

2
NoelC

Einige generische Pokes auf eine Antwort:

  1. Sie legen den Finger darauf - die XMM-Register nutzen Sie Vektoroperationen, z. B. SSE in verschiedenen Versionen, AVX usw. Es ist möglich, Vektoroperationen zu verwenden, um eine sehr komplexe Verarbeitung durchzuführen. Pixel in einem Bild enthalten beispielsweise im Allgemeinen mehrere verwandte Farbkanäle (z. B. Rot, Grün, Blau und Alpha). Vektoroperationen an Pixeln können zu enormen Leistungssteigerungen führen. In Anbetracht der Tatsache, dass Prozessoren heutzutage immer paralleler werden, anstatt schnellere Taktraten zu erhalten (22-Core-Xeon-Prozessor, jeder?), Ist es eine gute Sache, mehr CPU-intensive Operationen mit mehr Daten parallel auszuführen. Dadurch wird es möglich, bei einer begrenzten Speicherbandbreite gleichzeitig mehr Kerne für einen Job auszuführen.

  2. Wenn Sie nicht nur über winzige, modulare Funktionen verfügen (und wir müssen alle manchmal großen, komplexen Logikflüssen gegenüberstehen), können mehr Register die Effizienz verbessern. Im Idealfall sollten die am stärksten ausgeführten Codeabschnitte mit minimalen RAM-Zugriffen ausgeführt werden. Es ist daher eine gute Sache, alle wichtigen Variablen in Register eintragen zu können.

Beachten Sie, dass Vektoroperationen nicht nur für Fließkommazahlen gelten. Es gibt viele Ganzzahloperationen, bei denen SSE-Anweisungen von Vorteil sein können. Es ist beispielsweise möglich, hocheffiziente Speicherverschiebungen zu codieren, indem Cache-Zeilen mit 128-Bit-Anweisungen mit Prozessoren geladen werden, deren Prozessoren in den letzten 15 Jahren gebaut wurden (dh, sie unterstützen nur SSE2).

Nicht zuletzt kann der Prozess, Daten in die XMM-Register zu laden und aus diesen zu entfernen, eine Herausforderung sein. Wenn Sie den Systementwurf nicht sorgfältig geplant haben, kann das Hin- und Herschalten zwischen Registern ohne Vektoren und der Verwendung von Vektoren ineffizient sein.

Wenn Sie jedoch erst einmal darüber nachdenken, was Vektoroperationen für Sie tun können, eröffnen sich ein paar coole neue Horizonte. Stellen Sie sich zum Beispiel ein Schleifenobjekt vor, das die mehrfache Verschachtelung von Schleifen mit beispielsweise X- und Y-Koordinaten in einem einzigen Vektor ermöglicht. Nur eine PADDD-Anweisung (_mm_add_epi32) kann eine äußere Schleifenvariable inkrementieren UND eine innere Schleifenvariable zurücksetzen, um die nächste Gruppe von Iterationen vorzubereiten.

Eine praktische Referenz:

https://software.intel.com/sites/landingpage/IntrinsicsGuide/

Vielen Dank für die ausführliche Antwort, akzeptiert, aber nicht genug Ruf, um abzustimmen. Link auch sehr nützlich. Bulat M. vor 7 Jahren 0