Gibt es in AVX irgendein spezielles Makro, das hilft, die direkte Konstante für _mm256_shuffle_*
intrinsics zu konstruieren, wie _MM_SHUFFLE(..)
für sein SSE-Gegenstück? Ich kann keine finden.Makro zum Generieren von Immediaten für AVX shuffle intrinsics
1
A
Antwort
3
Sie verwenden immer noch _MM_SHUFFLE()
für Shuffles, die den Steuereingang als 8bit sofort nehmen. z.B. _mm256_shuffle_epi32
(vpshufd
) mischt das gleiche auf beiden Spuren.
_MM_SHUFFLE(dd,cc,bb,aa)
packt nur die niedrigen 2 Bits von jedem arg in 0bddccbbaa
.
Sie können _MM_SHUFFLE(1,1,1,1)
(Broadcast-Element 1) als 0b01010101
, d. H. 0x55
schreiben.
Sie können C++ 14 Trennzeichen (oder was auch immer sie genannt werden) verwenden, um es als 0b01'01'01'01
für bessere menschliche Lesbarkeit zu schreiben, insb. in Fällen, in denen jedes Element anders ist.
Ich denke, base-4 ist in diesem Fall besser als binär. Zwei base-4 Ziffern sind eine Base-16 (hex) Ziffer. Wenn Sie zum Beispiel 3,1,1,1 shuffle, wäre das 3 * 4 + 1, 1 * 4 + 2 = 0xda. Auf der anderen Seite ist _MM_SHUFFLE grundsätzlich base-4 und besser lesbar. –
@Zboson: Können Sie Base-4 in C verwenden? Ich benutze _MM_SHUFFLE in C, aber '0baabbccdd' in asm. Ich denke, in einer '.S'-Datei, die gcc vor der Assemblierung durch CPP läuft, könnten Sie die Makrodefinition für _MM_SHUFFLE kopieren. –
Nein, ich mache es in meinem Kopf und schreibe den Hexwert aus oder schreibe einen Kommentar. Aber '_MM_SHUFFLE' ist im Grunde ein Basis-4-Makro. –