Wenn eine 16-Byte Last nicht in einer anderen Seite und Fehler überquert, dann movups
verwenden. Die hohen 4 Bytes sind der Müll, der im Speicher vorhanden ist. Es kann ein Problem sein, einen Cache-Fehler für die 4B zu verursachen, die Sie nicht interessieren, ebenso wie die Cache-Zeilen-Aufteilung.
Andernfalls verwenden Sie movq
/pinsrd
(SSE4.1), oder eine andere Möglichkeit, zwei Lasten + ein Shuffle auszuführen. movq
+ pinsrd
wird 3 Fused-Domain-Ups auf Intel SnB-Familien-CPUs sein, weil pinsrd
kann nicht Mikro-Sicherung. (Und seine ALU-UOP benötigt den Shuffle-Port (p5)).
Eine andere Möglichkeit: AVX VMASKMOVPS xmm1, xmm2, m128
.
Bedingtes bewegt gepackten Datenelementen aus dem zweiten Quelloperanden in das entsprechende Datenelement des Zieloperanden in Abhängigkeit von den Maskenbits mit jedem Datenelement zugeordnet ist (MSB des ersten Operanden src).
... Fehler werden nicht aufgrund auftreten beliebigen Speicherplatz verweisen, wenn das entsprechende Maskenbit für diesen Speicherplatz ist 0.
Intel Haswell: 3 kondensierten Domain Uops (eine Last und zwei Shuffle (p5)). 4c Latenz, einer pro 2c Durchsatz.
Es ist wahrscheinlich nicht sehr gut im Vergleich, vor allem. wenn der umgebende Code gemischt werden muss.
Ihre Sehr selten genommen bedingte Verzweigung, die movups
jederzeit verwendet es nicht zu bemängeln garantiert wird auch 3 kondensierte Domain Uops auf dem schnell weg, und einer von ihnen kann im Wettbewerb läuft auf PORT6 (nicht mit Vektor ALUs überhaupt). Die LEA ist auch nicht auf dem kritischen Pfad.
movlpd
ist sicher auf alle Daten zu verwenden. Es wird nie Fehler oder langsam mit Daten, die ein Fließkomma-NaN oder etwas ähnliches darstellt. Sie müssen sich nur darum kümmern, mit Anweisungen, die in der Insn ref Handbuch mit einem nicht leeren "SIMD Floating-Point Exceptions" Abschnitt aufgeführt sind. z.B. addps
kann "Überlauf, Unterlauf, ungültig, Genauigkeit, Denormal" Ausnahmen erzeugen, aber shufps
sagt "None".
Leider steuere ich nicht die Position oder die Dimensionen des Eingangs Also kann ich nicht überlesen. 'movq' und' pinsrd' ist auch, was ich mir ausgedacht habe; Danke für die Bestätigung. – jacobsa
Danke auch für den Hinweis über 'movlpd'. Aber meine Frage ist dann: Warum ist dokumentiert, wie sie insbesondere auf Fließkommawerte angewendet wird? – jacobsa
@jacobsa: Wenn Sie wissen, dass es lesbaren Speicher * vor * 12B gibt, können Sie von '[addr-4]' laden und dann verschieben ('psrldq'). Oder Sie können sogar die Adresse maskieren, um einen 16B-ausgerichteten Zeiger zu erhalten, der einige der gewünschten Daten abdeckt (und immer noch keine Fehler verursachen kann). –