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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.