Basics: multiplication overflow

Gast #834246
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.
#834257
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.
Gast #834293
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren