Ich versuche, einen c-Code zu einem optimierten mit Neon-Intrinsics zu konvertieren.
Hier sind die c-Codes, die über zwei Operanden operieren und nicht über Vektoren von Operanten.
%Vor%Die SEE-optimierte Version dieser Operation wurde bereits folgendermaßen implementiert:
%Vor%Ich habe diesen fast mit Neon-Intrinsic konvertiert:
%Vor% Ich vermisse nur die Neon-Äquivalente von _mm_mullo_epi16 ((a), (b));
und _mm_mulhi_epu16 ((a), (b));
. Entweder verstehe ich etwas falsch oder es gibt keine solchen intrinsischen Eigenschaften in NEON. Wenn es keine Entsprechung gibt, wie man diese Schritte mit NEONS-Intrinsics archiviert?
UPDATE:
Ich habe vergessen, den folgenden Punkt zu betonen: Die Operanten der Funktion sind uint16x8_t NEON Vektoren (jedes Element ist ein uint16_t = & gt; ganze Zahlen zwischen 0 und 65535). In einer Antwort schlug jemand vor, das intrinsische vqdmulhq_s16()
zu verwenden. Die Verwendung von diesem wird nicht mit der gegebenen Implementierung übereinstimmen, da die intrinsische Multiplikation die Vektoren als vorzeichenbehaftete Werte interpretiert und eine falsche Ausgabe erzeugt.
Sie können verwenden:
%Vor%Gibt einen Vektor von 32-Bit-Produkten zurück. Wenn Sie das Ergebnis in High- und Low-Parts aufteilen möchten, können Sie das NEON-Entpacken intrinsisch verwenden.
vmulq_s16 () ist das Äquivalent von _mm_mullo_epi16. Es gibt kein exaktes Äquivalent von _mm_mulhi_epu16; Die nächste Anweisung ist vqdmulhq_s16 (), die "sättigen, verdoppeln, multiplizieren, hohen Teil zurückgeben". Es arbeitet nur mit vorzeichenbehafteten 16-Bit-Werten und Sie müssen den Eingang oder Ausgang durch 2 teilen, um die Verdopplung aufzuheben.
Tags und Links c sse arm multiplication neon