Die beste Methode zum Mischen von 64-Bit-Teilen von zwei __m128i

8

Ich habe zwei __m128i s, a und b , die ich mischen will, so dass die oberen 64 Bits von a in die unteren 64 Bits von dst fallen und die unteren 64 Bits von b fallen in die oberen 64 von dst . d. h.

%Vor%

Entspricht:

%Vor%

oder

%Vor%

Gibt es einen besseren Weg als die erste Methode? Die zweite Anweisung ist nur eine Anweisung, aber der Wechsel zur Fließkomma-SIMD-Ausführung ist teurer als die zusätzliche Anweisung von der ersten.

    
Steve Cox 13.08.2014, 18:37
quelle

1 Antwort

1

Latenz ist nicht immer das Schlimmste überhaupt. Wenn es nicht Teil einer von einer Schleife getragenen dep-Kette ist, dann benutze einfach den einzelnen Befehl.

Auch könnte es keine geben! Agner Fogs Mikroarch-Dokument sagt, dass er in einigen Fällen keine zusätzliche Latenz gefunden hat, wenn er den "falschen" Typ von Shuffle oder Boolean auf Sandybridge verwendet. Mischungen haben immer noch die zusätzliche Latenzzeit. Auf Haswell sagt er, dass es keine zusätzlichen Verzögerungen beim Mischen von Shuffle-Typen gibt. (S. 140, Daten-Bypass-Verzögerungen.)

Also mach weiter und nimm shufps , es sei denn, dir ist wichtig, dass dein Code auf Nehalem schnell ist. (Frühere Designs (Merom / Conroe und Penryn) hatten keine zusätzlichen Bypass-Verzögerungen für die Verwendung der falschen Bewegung oder Shuffle.)

Bei AMD läuft shufps in der ivec-Domäne, genau wie Integer-Shuffles, also ist es in Ordnung, sie zu verwenden. Wie Intel laufen FP-Blends in der FP-Domäne und haben daher keine Umgehungsverzögerung für FP-Daten.

Wenn Sie mehrere asm-Versionen verwenden, abhängig davon, welche Befehlssätze unterstützt werden, ohne komplett verrückt zu werden, die optimale Version von allem für jede CPU wie x264 zu haben, könnten Sie falsche Ops in Ihrer Version für AVX-CPUs verwenden Verwenden Sie mehrere Anweisungen in Ihrer Nicht-AVX-Version. Nehalem hat große Strafen (2 Zyklusumgehungsverzögerungen für jeden Domänenübergang), während Sandybridge 0 oder 1 Zyklus ist. SnB ist die erste Generation mit AVX.

Pre-Nehalem (keine SSE4.2) ist so alt, dass es sich wahrscheinlich nicht lohnt, eine Version speziell dafür zu tunen, obwohl es keine Strafen für "falsches" Mischen gibt. Nehalem ist kurz davor, ein bisschen langsam zu sein, so dass Software, die auf diesen Systemen läuft, die härteste Zeit haben wird, in Echtzeit zu arbeiten oder sich nicht langsam zu fühlen. Schlecht auf Nehalem zu sein würde also zu einer schlechten Benutzererfahrung beitragen, da ihr System nicht gerade das schnellste ist.

    
Peter Cordes 06.07.2015, 02:03
quelle

Tags und Links