Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Simd/MMX, wie funktioniert das? (https://www.delphipraxis.net/159051-simd-mmx-wie-funktioniert-das.html)

Memnarch 11. Mär 2011 19:51

Simd/MMX, wie funktioniert das?
 
Guten Abend,
Ich bin vor kurzem über die Begriffe MMX/SIMD gestossen. Kurz gegoogled und SIMD bedeutet, das ich mit einer operation, einen Pool von daten bearbeiten kann.

Hab ich das richtig verstanden? Bringt das geschwindigkeitsvorteile? Und wie kann man sowas umsetzen?(In Delphi versteht sich :P)
(Ich glaube hier gehts richtung ASM?)

MFG
Memnarch

Medium 11. Mär 2011 20:18

AW: Simd/MMX, wie funktioniert das?
 
Huhu! :)

SIMD = Single Instruction, Multiple Data. Die Idee ist z.B.: Ich habe hier zwei Mal 4 Bytes, und die will ich paarweise Addieren. Hm, 4 Bytes passen nebeneinander in ein Register, nun brauche ich nur noch eine Operation, die diesen Inhalt als "4 Bytes" statt "1 Integer" interpretiert - und schon bist du bei MMX. SSE(2/3) ist im Grunde das selbe mit Floats. Wann immer eine große Menge gleich strukturierter Daten stromartig gleiche Verarbeitung erfahren sollen - und zwar am Stück - können SIMD-Techniken helfen.
Problem: Die Art und Weise der Daten und Abläufe muss schon recht passend darauf ausgerichtet sein, um ununterbrochen "pumpen" zu können, und den Prozess nicht durch andeweitige Arbeit zu unterbrechen. Grund: MMX/SSE laufen in den ganz normalen FPU Registern ab, die dazu in einem speziellen Modus läuft. Tut man nun zwischendrin was anderes, muss die FPU ständig hin und her schalten. Für einen Compiler sind solche Szenarien teilweise extrem schwierig zu erkennen, da man "naiv hinprogrammiert" oft strukturell sehr weit von SIMD-Aussehen entfernt ist. Folgerung ist, dass nur wenige Compiler SIMD opcodes erzeugen, geschweige denn optimal. Ich weiss von .NET, dass es das in Ansätzen versucht, der geschriebene Code und die Datenstrukturen die man verwendet aber ganz erheblichen Einfluss darauf haben ob und wie gut das hin haut.
Delphi tut dies garnicht, aber immerhin kennen neuere Compiler die entsprechenden Mnemonics im Inline-Assembler. Um den wird man dafür dann allerdings auch nicht herum kommen, so dass sich das schon zu einer größeren (und sau interessanten) Lerneinheit ausweitet :)

Memnarch 11. Mär 2011 23:06

AW: Simd/MMX, wie funktioniert das?
 
Dass das nicht leich wird, habe ich mir gedacht.

Geht SIMD auch, wenn zb

A+B*C (als beispiel) als formel wiederholt wird, allerdings für verschiedene datensätze. Geht da SIMD?

MFG
Memnarch

Medium 12. Mär 2011 03:04

AW: Simd/MMX, wie funktioniert das?
 
Jop, genau für sowas ist das sinnvoll. Im Grunde läuft das dann so ab: Du hast sagen wir 2 Sätze von A, B und C, die sind mal Singles. Für SSE würde man dann sagen: Push bitte A1 in den linken Teil des Registerstacks, A2 in den rechten. Dann push B1 links und B2 rechts, dann C1 links und C2 rechts. Dann, lieber Prozessor, tu so als wären das 2 Floats nebeneinander in deinen Registern, und mache "*", dann "+", und was dann da noch steht schlabber ich mir als Ergebnis wieder raus. Dann die nächsten zwei Stäze, usw. usf.
Das lohnt im Einzelfall schon für nur zwei Sätze, das richtige Potenzial nutzt man aber halt, wenn man sowas in größerer Menge durchnudeln kann, ohne die FPU wieder normal zu schalten zwischendrin - zumindest war das bei MMX so, SSE habe ich selbst noch nicht gebaut.
Wo ich mich von meinen aktuellen GPU Shader-Odysseen hab natzen lassen: Im Grunde ist es worscht, ob da immer die selben Berechnungen ablaufen, das war bei Vector- bzw. Stream-Processing wichtig, für bloßes SIMD nicht - sorry für die Verwirrung. Der "wichtige" Teil sind hier wirklich nur die Modeswitches, und selbst mit diesen kommt man schon besser weg als ohne SIMD - zumindest wenn man es einigermaßen geschickt anstellt, ist halt auch Übungs- und Ausprobierenssache, bis man die flotteste Kombi an Opcodes und Strukturen gefunden hat.

Memnarch 12. Mär 2011 15:44

AW: Simd/MMX, wie funktioniert das?
 
Joar.. ich schreib nen Softwarerenderer(chtzeit versteht sich) und habe die Situation, das ich Chunks von 8*8 pixel relativ hintereinander gleich behandeln kann. Da wäre z.B die Multiplikation/Berechnung der Farbwerte am ende. Der benötigte farbwert des Pixels(RGB) wird aus 3 anderen farben bereichnet. Also sowas wie:

Rot := RotA*Faktor + RotB*Factor + RotC*Factor (Wobei mein hier auch schonwieder Factor ausklammern könnte)

dasselbe für blau und Grün. Da ich also mit dem Softwarerenderer ziemlich viele PIxel durchnudel, hört sich SIMD nach der guten lösung an^^. (Momentan arbeite ich mitner auflösung von 512*512)

(Nur schon ein Call von einer Anderen funktion im RAsterizer pro Pixel fällt verdammt ins gewicht^^. Hatte ich mal am anfang >.<)

Du hast nicht zufällig nen Link zu einer SIMD einführung? Von ASM habe ich grob ne Ahnung, aber nur grob, aber alles was ich bisher zu SIMD gefunden habe war nicht so toll dokumentiert und war meist gleich ne DinA4 seite lang^^".

MFG
Memnarch

samso 12. Mär 2011 19:32

AW: Simd/MMX, wie funktioniert das?
 
Alles zum Thema SSE/MMX und Assembler findet man bei Intel

Intel Prozessor Manuals

Das ist allerdings definitiv mehr als eine DIN A4-Seite (ich würde mal 3-4000 schätzen - muss man aber natürlich nicht alles lesen). Ob man SSE oder MMX benutzt hängt von den Daten ab. Pauschal könnte man vielleicht sagen: MMX für Integer 8..32 Bit - SSE für Floatingpoint. Das Grund-Prinzip ist bei beiden Befehlssätzen das gleiche.

Ansonsten ist Wikipedia Dein Freund:

SIMD Extensions

Memnarch 12. Mär 2011 19:43

AW: Simd/MMX, wie funktioniert das?
 
Vielen Dank :)

Und mit DINA4 war eine seite von reinem Assembler Code gemeint. Immer so nach dem Motto: Und so siehts aus, finde selber raus wies geht.


MFG
Memnarch

littleDave 12. Mär 2011 20:23

AW: Simd/MMX, wie funktioniert das?
 
Bei mir in den Browser-Favoriten habe ich diesen Link. Ist eine kleine Übersicht (DinA4-Würdig), aber halt kein Tutorial.

Memnarch 13. Mär 2011 15:11

AW: Simd/MMX, wie funktioniert das?
 
Sehr interressanter link, danke :)

Blup 14. Mär 2011 09:08

AW: Simd/MMX, wie funktioniert das?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eine schon etwas ältere Unit von mir, hilft vieleicht beim Einstieg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz