Seite 1 von 1

Wie kann ich zwei Wörter aus einem 128 bit register addieren

Verfasst: 27. Nov 2011 18:10
von charfi90
Hallo,

wie kann ich zwei Wörter aus dem 128 bit Register auswählen und deren Werte addieren (beide Wörter sind im selben register) ?

wie kann ich ein Wort aus dem 128 bit Register extrahieren ?

viele Grüße

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 27. Nov 2011 19:02
von Domac
Hallo!

Verstehe ich das an der Stelle richtig, dass du in deinem xmm register sowas stehen hast wie: [0x00000000, 0x00000000, 0x00001234, 0x00005678] und du möchtest jetzt 0x00001234 und 0x00005678 addieren? Dann brauchst du afaik ein extra xmm register (und damit beantworte ich gleich noch deine zweite Frage); movss (move single scalar) %xmm0, %xmm1 z.B. und dann spielst du noch ein bissel mit shufps und einer geeigneten maske (0xFD) rum um dein wort 0x00001234 an erste position zu bringen und kannst dann mittels addss (add single scalar) in xmm1 oder xmm0 adden.
Btw.: wenn du die ganzen 128 bit aus deinem xmm register "extrahieren" möchtest, dann bietet sich auch movups/movaps (move un/aligned packed scalar) an... schau dazu am besten mal in die folien... ich nehm aus faulheit immer movups, da ich dann die speicher adressen nicht alignen muss. :P

Gruß,
domac

EDIT: Schau mal in Folie 7, eine wahre Offenbarung. ;-)

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 28. Nov 2011 02:07
von azrael
Abgesehen davon gibt es auch noch den Befehl

Code: Alles auswählen

haddps
, der so einen horizontalen Add implementiert.

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 29. Nov 2011 16:15
von jdn
haddps ist zwar eine nette Sache, aber SSE3. Darf das denn überhaupt verwendet werden?

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 29. Nov 2011 16:56
von mw1039
jdn hat geschrieben:haddps ist zwar eine nette Sache, aber SSE3. Darf das denn überhaupt verwendet werden?
Ihr duerft alles verwenden was auf den RBG-Poolrechnern laeuft und mittels der vorgegebenen CMakeLists.txt und den auf dem Aufgabenblatt angegebenen Kompilationsanweisungen kompiliert.

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 29. Nov 2011 20:01
von TBA
Die Verwendung von SSE3 & SSE4 führt aber die Aufgabenstellung ad absurdum. Es wird noch einmal drauf hingewiesen, dass es für die Verwendung von transposeImage() nur die halbe Punktzahl gibt. Mit SSE ist es recht aufwendig die Matrix zu transponieren, oder ggf. das Ergebnis gleich transponiert zu speichern.
Wenn man auf einmal Skalarprodukte und waagerechte Addition (aus SSE4 & SSE3) nutzen kann wird die Aufgabenstellung auf einmal ziemlich trivial und vom Aufwand nur unwesentlich schwieriger als transposeImage() zu nutzen.
So etwas sollte von Anfang an klarer geklärt sein!

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 29. Nov 2011 20:18
von mw1039
Ich ueberblicke aktuell nicht, inwiefern das das Problem trivial macht, aber es ist doch gut, wenn die Aufgabenstellung mal sehr leicht ist, oder? ;)
TBA hat geschrieben:So etwas sollte von Anfang an klarer geklärt sein!
Die Aufgabenstellung ist diesbezueglich eigentlich sehr praezise. Sie sagt, dass es in SSE geloest werden soll, sie sagt, es soll auf den Poolrechnern laufen und sie sagt es soll mit den angegebenen Befehlen kompilieren. Ich habe es nicht getestet, aber wenn SSE3 & 4 das alles erfuellen, ist es zulaessig.

Re: Wie kann ich zwei Wörter aus einem 128 bit register addi

Verfasst: 29. Nov 2011 20:39
von jdn
Da in der Vorlesung nur SSE und minimal SSE2 behandelt wurde, und im Rahmen der Vorlesung und auch in der Dokumentation von Intel SSE für SSE1 steht, finde ich die Aufgabenstellung in der Hinsicht eben nicht eindeutig. Und wie TBA ansprach, mit Instruktionen für Skalarprodukte und horizontale Addition wären bei mir einige Stunden Arbeit weggefallen. Keine Ahnung was die Musterlösung macht, aber bei den Ansätzen die ich so gesehen habe hätte der Bedarf bestanden. ;)