Multiplizieren von 128 Bit Zahlen

Gast #4897881
Lesenswert?
• ▲
▼
Hi,
Ich wollte mittels der ymm register z.b. mit Hilfe vpmuludq 2 128  bit 
Zahlen multiplizieren.
Es gibt bei den AVX2 Befelen immer das Problem des overflows an der 64 
bit Grenze, der nicht berücksichtigt wird, keine Flags gesetzt.
Ich suche einen Trick:
Ich kann ja 4 32 Bit Zahlen in einer ymm unterbringen und es geschieht 
dword(0)*dword(0)->qword(0)
dword(3)*dword(3)->qword(1)
dword(5)*dword(5)->qword(2)
dword(7)*dword(5)->qword(3)

also

DEST[63:0] ← SRC1[31:0] * SRC2[31:0]
DEST[127:64] ← SRC1[95:64] * SRC2[95:64
DEST[191:128] ← SRC1[159:128] * SRC2[159:128]
DEST[255:192] ← SRC1[223:192] * SRC2[223:192]

siehe http://www.felixcloutier.com/x86/PMULUDQ.html

also z.b. 0c0908af.234698ab.1b07ec09.209b3231 (4*32 =128Bit)

mal  1d0918af.334699ab.7b08eDa0.219f3e56

verteilen auf

00000000.0c0908af.00000000.234698ab.00000000.1b07ec09.00000000.209b3231
mal
00000000.1d0918af.00000000.334699ab.00000000.7b08eDa0.00000000.219f3e56

(jeweils) werden die 4 relevanten dwords Produkte in die 4 64 bit qwords 
des Ergebnis-ymm Registers reingerechnet.
Das gibt dann 4 qwords. Ich habs jetzt nich händisch ausgerechnet also 
eine 256 Bit Zahl im Ergebnisregister.
Und dann, wenn das soweit richtig ist, habe ioch dort etwas was aber 
noch nicht das richtige ist, sondern man muss noch irgendwie horizontal 
addieren. Mit Vpaddq denk ich...

Ich weiss es eben nicht.
Hat das nicht jemmand mal programmiert? In x86 Pentium mit AVX2 
extension, oder evtl AVX4.2.
Mir würde auch Produkt 2er 64 Bit words reichen..
Es ist knifflich...
Vielen Dank

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