-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
18. Jun 2012
Falls es jemanden interessiert, hab eine Lösung gefunden, wie man mit SSE einen Vektor normalisieren kann. Den genauen Performancegewinn muss ich noch messen, werd ich dann posten, aber läuft auf jeden fall schneller als die Alternative:
function TVec4.Normalize: Single;
//Compilieren mit asm?
{$IFDEF USEASM}
asm
MOVUPS XMM0, DQWORD PTR
//Copy stored in MMX2
MOVAPS XMM2, XMM0
...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Naja, es ginge, allerdings bräuchte man 4 Register. Das 1ste bleibt wies ist, beim 2. Packst du das 2. Element an 1. Stelle mit shufps, beim 3. das 3., beim 4. das 4., und 3 additionen später hätte man das Ergebnis an der 1sten Stelle des StartRegisters (wenn man all die geshuffelten Register aufs Startregister addiert). Wär aber sowas von umständlich.
Was mir noch fehlt ist ein wenig...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Ja, das hin und herschieben geht, mit SHUFPS, ist schon seit SSE1 dabei - Der Ansatz fürs Kreuzprodukt den ich weiter oben gepostet hatte benutzt das ganze auch.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Vielen Dank für die Erklärung.
Habs mit 16 byte Alignment am Laufen, doch der Gewinn an Geschwindigkeit beträgt +-0... werd mir also den Aufwand damit sparen, und es bei ganz normalen Arrays lassen.
Allerdings hab ich noch immer keine alternative zu addpsh ( Vertikales aufaddieren eines MMX Registers ) gefunden, falls man nur mit SSE1 arbeiten möchte...Hat da jemand einen Plan, wie man das...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Stimmt, sind natürlich byte...
zum alignment: Schon klar das lokale Variablen nur 8 byte-aligned sind, doch wenn ich nun vor meinem array eine Variable von 1 byte größe Deklariere, müsste doch rein Logisch das Array 8 byte weiter hinten und damit im 16-byte alignment liegen...tuts aber nicht ^^ versuch grad das ganze ohne array, nur mit pointer unt GetMem zu implementieren, denn GetMem ist ja 16...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Werd ich mal testen, wie hoch da der Geschwindigkeitsgewinn ist...Ist allerdings in der eigentlichen Vektorbibliothek kaum umsetzbar...müsste dafür ein eigenes Array schreiben was immer aligned ist, mal schauen
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Scheint 8 bit Aligned zu sein...Addr(Vecs) mod 16 ist immer 8, Egal an welcher Stelle es deklariert wird (zumindest wenn es ein dynamisches Array ist, festes Array ist gar nicht aligned)
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Aber wenn dynamische Arrays 16 bit Aligned sind müsste doch folgender Code möglich sein:
function AddVecsSSE(const av1, av2: TTestVec): TTestVec;
asm
MOVAPS XMM0, DQWORD PTR
MOVAPS XMM1, DQWORD PTR
ADDPS XMM0, XMM1
MOVUPS DQWORD PTR , XMM0
end;
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
@mkinzler Soweit klar, deswegen sagte ich ja dass ich auch eine Variante für 64Bit Pflege - welche der Entspricht die komplett ohne assembler auskommt, und deswegen auch für Uralt PC's eingesetzt werden kann (<1999), auch wenn ich kaum glaube das so etwas noch wirklich genutzt wird und wenn, derjenige versucht darauf Spiele zu spielen ;)
Ist ein deklariertes Array eigentlich aligned? bzw...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Auf das Problem dass man mit SSE1 noch kein MMX-Register aufaddieren kann bin ich auch gerade gestoßen...ist echt ziemlich nervig...
Man könnte natürlich 2 Varianten schreiben - eine für SSE 3.0 und eine für SSE 1 - dann wäre ich allerdings für diese Prozeduren bei 3 verschiedenen Varianten die implementiert werden müssen...Normal für 64 Bit-Compiler (falls ich mal auf die Idee komme den zu...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Da das Projekt an dem ich arbeite kein Tripl-A Titel werden soll, sondern nur ein kleines Spiel mit ner schön anzuschauenden
3D-Grafik, und es mir hauptsächlich um den Lerneffekt geht (hab z.B. schon ne Konsole implementiert, mit ConsoleVar/Command-System, oder den
Flocking Algorithmus von Craig Reynold zur Gegnerbewegung), bringt das hier einiges an Performancegewinn ;) Hab nicht vor mich in...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Mittlerweile sind es durch die kleinen aber feinen Optimierungen von Himitsu sogar 20.000 Zykel - und damit bin ich ziemlich zufrieden ;)
Vielen Dank für deine Erklärung zu SSE, hat echt ein paar Fragen geklärt. Allerdings hab ich SSE schon an mehreren Stellen im Einsatz gefunden - an der selben
Stelle an der ich auch im Moment arbeite, 3D-Mathematik, die ja Hauptsächlich in Spielen...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
14. Jun 2012
Bin jetzt grad dabei die SSE-Beschleunigung in meine Vektor-Unit einzubauen...
allerdings steh ich grad vor nem Problem: Ich möchte die Länge eines Vektors bestimmen...
Die einzelnen Werte zu quadrieren ist ja kein Problem, allerdings scheiter ich grad dabei
eine Alternative zum C++ Intrinsic _mm_hadd_ps zu finden...Dieser Intrinsic addiert alle 4 Werte
in einem MMX Register und speichert...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Okey...ach klar, ist ja JG. Werds trotzdem mal hinter das 2. CMP packen, der übersicht halber.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Jupp, hab ich... aber müsste es nicht statt
CMP ECX, 0
JLE @@exit
DEC ECX
CMP ECX, $07FFFFFF
JG @@exit
Erst nach dem 2. Compare verringert werden?
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Hört sich erstmal ziemlich kontraproduktiv an dass ein Befehl speziell für Schleifen langsamer ist als ein Jump-Befehl zum selben Label...
Aber naja, wieder was für guten Programmierstil gelernt.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Die Variante läuft auf jeden Fall wunderbar, und der Performancegewinn kann sich auch sehen lassen.
Ich blick noch nicht so 100% durch, aber *fängt an kaffee in Verstehen zu konvertieren* ;)
Okey, habs soweit gecheckt...Allerdings geht so ja die Möglichkeit verschiedener Offsets verloren - bzw wird auf power of 2 beschränkt...aber Reicht ja.
Vielen Dank mal wieder himitsu ;)
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Ist mir auch schon aufgefallen, hab noch nicht so viel mit asm gemacht und dementsprechend vergessen gehabt...ist gefixxt der Fehler ;)
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Ach klar, macht Sinn...Danke, werd mal versuchen die Schleife für Arrays ähnlich zu optimieren
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Okay, das läuft schonmal etwa 10% schneller...
Nur warum liegt av1 bei DQWORD PTR , av2 bei EDX und Result bei ECX?
Muss man die nicht eigentlich erst dort hin moven?
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by Edlmann,
13. Jun 2012
Nachmittag DPLer,
ich habe mich heute mal daran Gesetz, die SIMD-Extensions ein wenig genauer unter die Lupe zu nehmen,
speziell wie man diese zur Berechnung von Vektoren einsetzen kann. Ich hab dafür ein paar kleine Testroutinen gebastelt,
und hätte 2 Fragen:
1. Wo liegt noch Optimierungspotential?
2. Warum ist die normale Addition gegenüber der SSE-Single-Vector Addition nur minimal...