SSE: Grundsatzproblem mit dem Spreichern von Zwischenwerten

hamster34
Erstie
Erstie
Beiträge: 22
Registriert: 28. Apr 2010 11:01

SSE: Grundsatzproblem mit dem Spreichern von Zwischenwerten

Beitrag von hamster34 »

Hallo,

ich kommee bei der Berechnung mit SSE nicht weiter:
Analog zu unserer Version in C wollte ich mir eigentlich 2 tempoäre Arrays aufmachen, in die ich dann jewils die Vorberechnung speichere. Das funktioniert aber nicht wie geplant, da ich mir ja kein Array in ".data" definieren kann. Außerdem konnte ich keine Array in C anlegen und dann in Assembler übergeben, da mir dafür ja die Übergabeparameter ausgehen.
Eine Version, die sämtliches auf den Stack pusht kommt mir sehr komplex vor - vorallem was den späteren Zugriff angeht.

Könnte mir jemand einen Tip geben, wie man das am sinnvollsten macht?

Vielen Dank im Vorraus!

skY
Erstie
Erstie
Beiträge: 20
Registriert: 21. Sep 2011 15:17

Beitrag von skY »

Übungsblatt 4 (oder 3?)

Sagen wir du hast ein Array tmp1. Dann schreibst du bei den Inputoperanden "m"(tmp1) dazu. Dann kannst du das per %x ansteuern und die entsprechende Adresse per normalen Assemblerbefehlen an ein normales Register übergeben und damit arbeiten. x ist davon abhängig, an welcher Stelle bei den Operanden das steht. "m" steht für Übergabe im Speicher.

Benutzeravatar
DB_420
Mausschubser
Mausschubser
Beiträge: 89
Registriert: 24. Nov 2010 15:12

Re:

Beitrag von DB_420 »

skY hat geschrieben:Übungsblatt 4 (oder 3?)

Sagen wir du hast ein Array tmp1. Dann schreibst du bei den Inputoperanden "m"(tmp1) dazu. Dann kannst du das per %x ansteuern und die entsprechende Adresse per normalen Assemblerbefehlen an ein normales Register übergeben und damit arbeiten. x ist davon abhängig, an welcher Stelle bei den Operanden das steht. "m" steht für Übergabe im Speicher.
Das geht nur bis zu einem gewissen grad - der gcc Inline Assembler lädt am Anfang die Adressen dieser "m"-Operanden, dadurch gehen dir u.U. die Register aus!

Ich habe mir alle Parameter einfach ein ein Array geschrieben und dem SSE-Code das Array (d.h. ein Pointer darauf) als Eingabe gegeben, so konnte ich beliebig viele Parameter übergeben.
Tutor:
Mathe II Inf (SS12)
Mathe I Inf (WS11/12)

hamster34
Erstie
Erstie
Beiträge: 22
Registriert: 28. Apr 2010 11:01

Re: SSE: Grundsatzproblem mit dem Spreichern von Zwischenwer

Beitrag von hamster34 »

DB_420 hat geschrieben:
Das geht nur bis zu einem gewissen grad - der gcc Inline Assembler lädt am Anfang die Adressen dieser "m"-Operanden, dadurch gehen dir u.U. die Register aus!
Sehe ich auch so. Die Übung 4 habe ich mir auch noch mal angesehen, aber mit 3 Arrays ist das aus meiner Sicht schlichtweg nicht möglich.

DB_420 hat geschrieben:Ich habe mir alle Parameter einfach ein ein Array geschrieben und dem SSE-Code das Array (d.h. ein Pointer darauf) als Eingabe gegeben, so konnte ich beliebig viele Parameter übergeben.
Das muss ja schon in C passieren. Dürfen wir das machen?

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: SSE: Grundsatzproblem mit dem Spreichern von Zwischenwer

Beitrag von mw1039 »

hamster34 hat geschrieben:Das muss ja schon in C passieren. Dürfen wir das machen?
Ja, duerft ihr. Solange ihr das nur einmal und nicht innerhalb einer Schleife 10.000 mal oder so macht.

skY
Erstie
Erstie
Beiträge: 20
Registriert: 21. Sep 2011 15:17

Re: SSE: Grundsatzproblem mit dem Spreichern von Zwischenwer

Beitrag von skY »

Also bei mir funktioniert es momentan problemlos mit 4 übergebenen temporären Arrays und einem weiteren Wert, alle per "m" übergeben. Warum auch nicht? Sicher, man muss sich dann "von Hand" die entsprechenden Adressen, also %0-%x., in ein Register laden, um damit zu arbeiten - aber es funktioniert. Natürlich ist es bei weitem nicht die optimale Lösung, wenn ich Lust habe, kürze ich das noch etwas. Aber eigentlich sollte man doch (fast)beliebig viele Werte per "m" übergeben können, oder nicht?

Thomas Huxhorn
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 172
Registriert: 6. Okt 2011 15:25

Re: Re:

Beitrag von Thomas Huxhorn »

DB_420 hat geschrieben:
skY hat geschrieben:Ich habe mir alle Parameter einfach ein ein Array geschrieben und dem SSE-Code das Array (d.h. ein Pointer darauf) als Eingabe gegeben, so konnte ich beliebig viele Parameter übergeben.
Danke! Manchmal kann eine Lösung so einfach sein :)

SirtobeD
Mausschubser
Mausschubser
Beiträge: 68
Registriert: 28. Okt 2010 18:56

Re: SSE: Grundsatzproblem mit dem Spreichern von Zwischenwer

Beitrag von SirtobeD »

Hey!

Ist es auch erlaubt mehrere Assembler-Teile zu benutzen, also nach den Prinzip:

1. ixtemp in Assembler berechnen (Eingabeparameter: anfangsadressen src, ixtemp)
2. ix in Assembler berechnen (Eingabeparameter: anfangsadressen ixtemp,ix)
3. iytemp in Assembler berechnen (Eingabeparameter: anfangsadressen src, iytemp)
4. iy in Assembler berechnen (Eingabeparameter: anfangsadressen iytemp,iy)
5. Wurzel von ix und iy (Quadrieren schon im SSE-Teil erledigt) in c berechnen.

Dann muss man ja immer nur zwei Register mit den jeweiligen Start-Adressen belegen?

Das macht ja Performance-mäßig so gut wie keinen Unterschied, relevant sind ja nur die ganzen Schleifendurchläufte in denen dann auch die Berechnungen durchgeführt.

Ist es also erlaubt dass so zu machen oder nicht?

Mfg,
Tobi D.

mw1039
Computerversteher
Computerversteher
Beiträge: 346
Registriert: 12. Apr 2011 12:18

Re: SSE: Grundsatzproblem mit dem Spreichern von Zwischenwer

Beitrag von mw1039 »

Ja, das ist ok so. Ich denke das sollte wirklich keinen merkbaren Geschwindigkeitsunterschied machen.

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: SSE: Grundsatzproblem mit dem Spreichern von Zwischenwer

Beitrag von Ronny »

SirtobeD hat geschrieben: ... also nach den Prinzip:
1. ixtemp in Assembler berechnen (Eingabeparameter: anfangsadressen src, ixtemp)
2. ix in Assembler berechnen (Eingabeparameter: anfangsadressen ixtemp,ix)
3. iytemp in Assembler berechnen (Eingabeparameter: anfangsadressen src, iytemp)
4. iy in Assembler berechnen (Eingabeparameter: anfangsadressen iytemp,iy)
5. Wurzel von ix und iy (Quadrieren schon im SSE-Teil erledigt) in c berechnen.
Sie muessen dabei aber aufpassen, wenn sie folgendes machen:

Code: Alles auswählen

__asm__ (
"..." // ixtemp berechnen
: : "a"(ixtemp), ....
);
__asm__ (
"..." // ix berechnen
: : "a"(ixtemp), ....
);
Wenn ixtemp beide Male im selben Register (hier eax) uebergeben wird, wird es beim zweiten Block nicht wieder in eax geschrieben, wenn eax zwischen den asm Bloecken nicht veraendert wurde.
Der Compiler geht naemlich davon aus, dass Inputregister innerhlab eines asm Blocks nicht veraendert werden.
Das kann zu sehr schwer nachvollziehbaren Laufzeitfehlern fuehren.

Antworten

Zurück zu „Archiv“