Dasselbe passiert mit a union { _m128 m; float[4] a; } Auch.
Warum verwenden SSE-Operationen diese Reihenfolge? Es ist keine große Sache, aber etwas verwirrend.
Und eine Anschlussfrage:
Beim Zugriff auf Elemente im Array nach Index sollte man in der Reihenfolge zugreifen 0..3 oder die Bestellung 3..0 ?
Verwandte: Konvention zum Anzeigen von Vektorregistern. Das einzige, was “umgekehrt” ist, ist die arg-Reihenfolge von _mm_set Eigenheiten; alles andere ist normales Little-Endian; Greifen Sie nicht rückwärts auf Ihre Elemente zu, es sei denn, dies ist aus einem anderen Grund einfacher. Auch Aliasing a float* auf a __m128 ist kein wohldefiniertes Verhalten über Compiler hinweg (Strikt-Aliasing-Verletzung); siehe Drucken einer __m128i-Variablen
– Peter Cordes
29. März um 7:47 Uhr
Echo
Abhängig davon, was Sie tun möchten, können Sie beides verwenden _mm_set_ps oder _mm_setr_ps.
__m128 _mm_setr_ps (float z, float y, float x, float w )
Stellt die vier SP FP-Werte in umgekehrter Reihenfolge auf die vier Eingänge ein.
Es ist nur eine Konvention; sie mussten pflücken etwas Reihenfolge, und es spielt wirklich keine Rolle, wie die Reihenfolge lautet, solange sich alle daran halten. Intel mag Little-Endianness.
Was den Zugriff per Index betrifft, ist es am besten, dies zu vermeiden. Nichts beeinträchtigt die Vektorleistung so sehr wie elementweise Zugriffe. Wenn Sie müssen, versuchen Sie, die Dinge so einzurichten, dass die Indizierung mit den Hardware-Vektorspuren übereinstimmt. Das werden die meisten Vektorprogrammierer (meiner Erfahrung nach) erwarten.
Intel folgt nicht ihrer eigenen Ordnung. Sie können zB mit _mm_extract_ps() Intrinsic testen, das Integer-Index akzeptiert.
– Bald
21. Mai 2018 um 23:22 Uhr
Stimmt das nicht mit der Little-Endian-Natur von x86-Hardware überein? Die Art und Weise, wie es die Bytes eines Long Long speichert.
Ja, es ist nur eine normale Little-Endian-Reihenfolge. Für SSE (und SIMD-Programmierung im Allgemeinen) spielt die tatsächliche Reihenfolge der Elemente im Allgemeinen keine große Rolle. außer wenn Sie anfangen, die Breite von Elementen zu ändern (Packen/Entpacken usw.) oder irgendetwas tun, das auf bestimmte Elemente zugreift (Permutationen, Einfügen/Extrahieren usw.).
– PaulR
8. März 2011 um 21:18 Uhr
10544400cookie-checkWarum kehrt SSE set (_mm_set_ps) die Reihenfolge der Argumente um?yes
Verwandte: Konvention zum Anzeigen von Vektorregistern. Das einzige, was “umgekehrt” ist, ist die arg-Reihenfolge von
_mm_set
Eigenheiten; alles andere ist normales Little-Endian; Greifen Sie nicht rückwärts auf Ihre Elemente zu, es sei denn, dies ist aus einem anderen Grund einfacher. Auch Aliasing afloat*
auf a__m128
ist kein wohldefiniertes Verhalten über Compiler hinweg (Strikt-Aliasing-Verletzung); siehe Drucken einer __m128i-Variablen– Peter Cordes
29. März um 7:47 Uhr