Neon entspricht SSE-Eigenschaften

8

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.

    
Kami 02.07.2012, 11:37
quelle

2 Antworten

5

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.

    
Guy Sirton 02.07.2012, 18:30
quelle
1

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.

    
BitBank 02.07.2012 22:02
quelle

Tags und Links