Verschiebung von 4 ganzen Zahlen nach rechts um verschiedene Werte SIMD

SSE bietet keine Möglichkeit, gepackte ganze Zahlen um einen variablen Betrag zu verschieben (ich kann alle Anweisungen von AVX und älter verwenden). Du kannst nur gleichmäßige Schichten machen. Das Ergebnis, das ich für jede ganze Zahl im Vektor erzielen möchte, ist das folgende:

i[0] = i[0] & 0b111111;
i[1] = (i[1]>>6) & 0b111111;
i[2] = (i[2]>>12) & 0b111111;
i[3] = (i[3]>>18) & 0b111111;

Versuchen Sie im Wesentlichen, eine andere Gruppe von 6 Bits in jeder Ganzzahl zu isolieren.

as ist die optimale Lösun

Things, über die ich nachgedacht habe: Sie können eine variable Verschiebung nach rechts simulieren, mit einer variablen Verschiebung nach links und einer einheitlichen Verschiebung nach rechts. Ich dachte darüber nach, die gepackten ganzen Zahlen mit jeweils einem anderen Betrag zu multiplizieren (also eine Verschiebung nach links zu simulieren). Dann mit dem Ergebnis, können Sie eine einheitliche Rechtsverschiebung machen, um die Antwort zu bekommen. Das Problem mit dieser spezifischen Operation, die ich für die Multiplikation verwenden würde, wäre_mm_mullo_epi32, das eine enttäuschende Latenz hat (10 Zyklen für haswell), und bei meinem Programm müsste es auf das Ergebnis warten, da dieses spezielle Ergebnis eine Abhängigkeit für die nächsten Anweisungen darstellt. Insgesamt wäre diese Methode meiner Meinung nach nur ein wenig schneller als die Brute-Force-Methode, bei der entpackt, mit skalaren Anweisungen verschoben und dann der Vektor neu gepackt wird, was meiner Meinung nach etwa 20 Zyklen dauern würde.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage