q15mulr_sat_s: Arithmetische Wasm-SIMD-Instruktion
Die q15mulr_sat_s-SIMD-Arithmetikinstruktion führt eine spurweise sättigende Multiplikation mit Rundung im Q15-Format auf zwei vorzeichenbehafteten v128-Werten durch, die jeweils als i16x8 interpretiert werden. Dabei wird das Ergebnis auf den vom Werttyp zulässigen Bereich begrenzt. Die Ausgabe ist ein einzelner Wert, der als i16x8 interpretiert wird.
Probieren Sie es aus
(module
(import "console" "log" (func $log (param i32)))
(func $main
v128.const i16x8 16384 32767 8192 -32768 16384 16384 0 -16384
v128.const i16x8 16384 16384 16384 32767 -16384 16384 99 16384
i16x8.q15mulr_sat_s
i16x8.extract_lane_s 7
call $log
)
(start $main)
)
WebAssembly.instantiateStreaming(fetch("{%wasm-url%}"), { console });
Syntax
i16x8.q15mulr_sat_s
i16x8.q15mulr_sat_s-
Die Instruktion
i16x8.q15mulr_sat_s.
Typ
[input1, input2] -> [output]
Binäre Kodierung
| Instruktion | Binärformat | Beispieltext => Binärdarstellung |
|---|---|---|
i16x8.q15mulr_sat_s |
0xfd 130:u32 |
i16x8.q15mulr_sat_s => 0xfd 0x82 0x01 |
Beschreibung
Die Instruktion q15mulr_sat_s multipliziert gleichzeitig 8 Paare vorzeichenbehafteter 16-Bit-Ganzzahlen im Q15-Format als Festkommazahlen und rundet und sättigt die Ergebnisse. Solche Operationen sind beispielsweise in der Audioverarbeitung und beim maschinellen Lernen üblich, etwa für FIR-/IIR-Audiofilter und die Inferenz neuronaler Netze.
Q15 ist ein Festkommazahlenformat, bei dem eine vorzeichenbehaftete 16-Bit-Ganzzahl eine reelle Zahl im Bereich von −1.0 bis 1.0 repräsentiert. Der Wert 32767 (0x7FFF) entspricht 1.0, und −32768 (0x8000) entspricht −1.0. Die Multiplikation zweier Q15-Zahlen ergibt ein Q30-Ergebnis, das als 32-Bit-Ganzzahl gespeichert wird. Um wieder zu Q15 (16 Bit) zu gelangen, verschieben Sie das Ergebnis um 15 Bit nach rechts.
Für jede der einander entsprechenden Spuren der beiden 16x8-Eingabewerte führt die Instruktion q15mulr_sat_s folgende Schritte aus:
- Sie multipliziert die beiden Werte miteinander.
- Sie rundet das Produkt, indem sie
0x4000(2¹⁴beziehungsweise16384) addiert. Dadurch wird auf die nächste Ganzzahl gerundet, statt Nachkommastellen abzuschneiden. - Sie verschiebt das Ergebnis um 15 Bit nach rechts und wandelt damit Q30 zurück in Q15 um.
- Falls nötig, sättigt sie das Ergebnis auf den Bereich von −32768 bis 32767, um einen Überlauf mit Umbruch zu vermeiden. So bleibt das Ergebnis innerhalb des für das Q15-Format zulässigen Bereichs.
Sehen wir uns an, wie der Wert -8192 aus unserem Beispiel entsteht, der in Spur 7 des Ausgabewerts gespeichert ist.
- Spur 7 der beiden Eingabewerte enthält
-16384und16384. - Die Multiplikation dieser Werte ergibt das Produkt
-268435456. - Durch Addition des Rundungswerts (
16384) ergibt sich-268419072. - Wird dieses Ergebnis um 15 Bit nach rechts verschoben, ergibt sich der endgültige Wert
-8192.
Spezifikationen
| Spezifikation |
|---|
| WebAssembly Core Specification> # vector-instructions%E2%91%A8> |