Forum: Digitale Signalverarbeitung / DSP / Machine Learning Basics: multiplication overflow


von Gast (Gast)


Lesenswert?

Guten Abend Freunde,


ich arbeite gerade an einem Vektorprozessor (SIMD). Da habe ich ein 
Problem mit der Multiplikation. Ich habe 16-bit Daten. Die 
Multiplikation passt in 32-bit Bereich. Ich habe aber nur 16-bit zur 
Verfügung. D.h. die Multiplikation liefert nur die LSBs als Ergebnis und 
im Falle eines Overflows erfolgt wrap-around.

Was kann ich an der Stelle machen? Ich habe mit Schiebe-Operatoren 
versucht. Aber die Ergebnisse waren trotzdem nicht richtig :-(

Zum veranschaulichen des Problems:

short A1,A2,B1,B2;
int A,B;

Packing erfolgt hier:
A = (A1,A2);
B = (B1,B2);


C = mul(A,B);

C sieht so aus: C = (A1*B1,A2*B2)

Ich hoffe, das ist verständlich.

von Kai G. (runtimeterror)


Lesenswert?

Deine Architektur kenne ich leider nicht. Aber im Notfall sollte 
Folgendes gehen:
1
zu berechnen: x * y
2
3
x = 256 * a + b // x und y in je zwei 8-Bit-Werte zerlegen
4
y = 256 * c + d
5
6
x * y = (256 * a + b) * (256 * c + d)
7
      = 65536 * a * c + 256 * (a * d + b * c) + b * d
8
      = a*c << 16 + (a*d + b*c) << 8 + b*d
(hoffe, ich habe mich nicht vertippt)

d.h. du formst die 16x16-Multiplikation in vier 8x8-Multiplikationen und 
ein paar Addidionen um.

von Gast (Gast)


Lesenswert?

Hi Kai,


danke für die schnelle Antwort. Ist das aber nicht rechenintensiv? Ich 
soll bei meiner Aufgabe Leistungsverbrauch minimieren, d.h. Arbeitzyklen 
reduzieren. Deshalb musste ich den Vektorprozessor nehmen, weil ja auf 
eine Datenmenge parallel die gleiche Operation angewendet werden kann 
(SIMD).

Ich probiere deine Lösung und schau, wie das Ergebnis aussieht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.