![]() |
AW: [ASM / SSE] Vektoroperationen
Persönliche Meinung & Erfahrung
Was ich jetzt sage, kann mir vielleicht den Kopf kosten, aber naja :-P SSE 3.0 wurde 2004 auf den Markt gebracht. Wenn du also in kauf nimmst, dass ca. 30% der Anwender dein Programm nicht nutzen können, kannst du SSE 3.0 benutzen. Ansonsten nutze SSE 1.0, das ist verlässlich auf allen Platformen vorhanden. Jedoch fehlen elementare Funktionen. Schonmal über eine parallelisierte Matrixmultiplikation nachgedacht. Klappt mit SSE eigentlich super, Matrixzeilen spalten, Vektor laden, Vektor 3 mal kopieren, mit jeder Spalte multiplizieren, ja und dann wirds schwer. SSE erlaubt einem nicht, eine Zeile zusammen zu addieren. addpsh gibts erst bei SSE 3.0 und das nervt. Welchen Zweck erfüllt mir SSE wenn ich nach dem multiplizieren wieder alles rausladen muss und selbst zusammen addieren darf. Auch wenn wir von CISC und RISC geredet haben und ich eigentlich mehr der RISC-Fan bin. Wenn man sowas schon wirklich machen muss, solche Erweiterungen, die nun einfach dafür ausgelegt sind, 3D-Anwendungen zu beschleunigen, sollten direkt Befehle wie Kreutzprodukt oder Matrixmultiplikation einbauen, die benötigt werden. Außerdem sollte es batch-Funktionen geben und nicht per Hand jeder einzellne Vektor geladen werden müssen, ähnlich meinem rep movsb beispiel. Wenn muss ich denn mal einen einzellnen Vektor verrechnen? Und das ganze soll dann noch so zeitkritisch sein, dass mit die normale FPU nicht reicht? Also da hört's auf. Das Ganze könnte doch so aussehen:
Code:
Kein Befehl muss mehr dekodiert werden und in einem Rutsch rechnet er einem alles durch. Das was man auch wirklich braucht. Und dafür gibt's ne Grafikkarte die genau DAS macht.
mov edx, &matrix
mov esi, vertexArray mov ecx, length(vertexArray) rep mulMatPS SSE ist ein Denkfehler mit Designfehler. Der momentane Trend, die Grafikprozessoren mit ihrer Rechenleistung allgemein zugänglicher zu machen ist imo der richtige. Wozu habe ich 1000 Shader auf der Platine wenn ich sie nur für's Bildchen-Malen nutzen kann, obwohl sie wesentlich mehr können? Zitat:
Bei SSE ist der Vorteil eben klar, du lädst direkt alle vier Werte gleichzeitig, die berechnest alle vier gleichzeitig und du schreibst sie auch gleichzeitig wieder zurück. Bei heutiger Hardware ist es defactor kein Unterschied ob du einen oder vier Werte in den RAM packst. Jede mal neu die Adresse zu laden braucht dagegen mehr Zeit. Zitat:
|
AW: [ASM / SSE] Vektoroperationen
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 nutzen), SSE1 und SSE3...und wie findet man heraus welches SSE von der CPU unterstützt wird? Ob SSE generell möglich ist lässt sich ja über das 25.? oder so Bit der CPUInfo abfragen...bzw über System.TestSSE, aber TestSSE unterscheidet nach dokumentation nur zwischen SSE1 und SSE2... |
AW: [ASM / SSE] Vektoroperationen
Unter 64Bit ist SSE obligatorisch, da keine FPU-Befehle mehr unterstützt werden.
|
AW: [ASM / SSE] Vektoroperationen
@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 ;)
[Edit] Ist ein deklariertes Array eigentlich aligned? bzw kann man ein Array so deklarieren, dass es im Arbeitsspeicher aligned ist? Dann könnte man statt MOVUPS ja MOVAPS benutzen (aligned Moving), welches einen weiteren Geschwindigkeitsvorteil bringen würde |
AW: [ASM / SSE] Vektoroperationen
FastMM erstellt und unterteilt seine Speicherblöcke aligned (ich glaub aktuell alle 16 Byte)
dynamische Arrays und alles über GetMem ist somit ordentlich ausgerichtet. Der Stack ist auch möglist auf 4 Byte ausgerichtet (falls da keiner Mist baut) Zitat:
Zitat:
|
AW: [ASM / SSE] Vektoroperationen
Aber wenn dynamische Arrays 16 bit Aligned sind müsste doch folgender Code möglich sein:
Delphi-Quellcode:
Er führt allerdings zu einer Zugriffsverletzung...
function AddVecsSSE(const av1, av2: TTestVec): TTestVec;
asm MOVAPS XMM0, DQWORD PTR [&av1] MOVAPS XMM1, DQWORD PTR [&av2] ADDPS XMM0, XMM1 MOVUPS DQWORD PTR [&Result], XMM0 end; |
AW: [ASM / SSE] Vektoroperationen
Zitat:
|
AW: [ASM / SSE] Vektoroperationen
Zitat:
|
AW: [ASM / SSE] Vektoroperationen
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)
|
AW: [ASM / SSE] Vektoroperationen
Also reserviere dein Array + 15 Byte. Prüfe die Adresse, verschiebe den Pointer um addr mod 16 bytes und du hast einen richtigen Speicherbereich.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz