![]() |
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 |
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 :) |
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 |
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. |
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 |
AW: Simd/MMX, wie funktioniert das?
Alles zum Thema SSE/MMX und Assembler findet man bei Intel
![]() 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: ![]() |
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 |
AW: Simd/MMX, wie funktioniert das?
Bei mir in den Browser-Favoriten habe ich
![]() |
AW: Simd/MMX, wie funktioniert das?
Sehr interressanter link, danke :)
|
AW: Simd/MMX, wie funktioniert das?
Liste der Anhänge anzeigen (Anzahl: 1)
Eine schon etwas ältere Unit von mir, hilft vieleicht beim Einstieg.
|
AW: Simd/MMX, wie funktioniert das?
super danke :)
Werde ich mal nen block drauf werfen. Kannst du grob sagen ob und was für einen performancevorteil dir die MMX variante gegebene hat? würde mich mal interressieren^^ |
AW: Simd/MMX, wie funktioniert das?
Mit MMX gings ca. 2-3 mal schneller.
|
AW: Simd/MMX, wie funktioniert das?
UI, das is natürlich was.
Noch nicht geschafft reinzuarbeiten, aber wenn ich morgen zeit hab mach ich mal nen paar stichproben^^. PS: Für MMX wird die FPU in nen anderen modus geswitched? Gehen wir mal davon aus mein ASM liegt in einer for schleife(außer dem ASM block ist da nichts drin) switched der bei jedem For durchlauf in den Modus rein/raus?(was dann ja wieder zu ner bremse führen würde) MFG Memnarch |
AW: Simd/MMX, wie funktioniert das?
Jain. Die erste MMX Anweisung sollte die FPU umschalten, und erst mit manuellem "EMMS" sollte die FPU wieder "normal" arbeiten. Alles, was sonst nur mit der gewöhnlichen ALU zu tun hat, kann problemlos nebenbei auch gemacht werden.
![]() |
AW: Simd/MMX, wie funktioniert das?
Vielleicht ist es für Dich sinnvoll Dir mal den folgenden Link anzuschaun:
![]() |
AW: Simd/MMX, wie funktioniert das?
@Samso: danke für den Link, aber in meinem Beispiel bringt es wenig ;). Obiges farbbeispiel war nur ein Beispiel. Ich schreibe einen Softwarerasterizer und die Mathematik dahinter muss ich optimieren. Da hilft Graphics32 leider wenig.(Außerdem schreib ich in die Bitmaps indem ich direkt die gegebenen positionen im speicher manipuliere, also ohne irgendwelche funktionen. Geht schön schnell^^).
@Medium: Danke, werde ich mir mal durchlesen. MFG Memnarch |
AW: Simd/MMX, wie funktioniert das?
so, ich schonwieder^^.
Versuche gerade per MMX mehrere integer zu multiplizieren und die einzelnen resultate dann zu addieren. Hier habe ich ein paar kleine probleme^^" folgendes schema: per MOVD werden die register wiefolgt bestückt (Formel wäre x = VARA*FactorA + VarB*FactorB + VarC*FactorC) mm1, VARA mm2, FactorA mm3, VARB mm4, FactorB mm5, VARC mm6, FactorC und jetzt gehts los, es gibt kein PMULLD, sondern nur PMULLW. Word hat aber soweit ich weiß 2 Bytes, integer aber 4 Bytes. Die register würden dann in 2Byte blöcken multipliziert(schätze ich könnte später immer 2 Integer in einen 64bit register kloppen, aber ich will es erstmal einfach haben). danach würde ich mm1,mm3 und mm5 addieren und per MOVD mm1 in meine zielvariable schieben. Dementsprechend ist der enstehende endwert eher suboptimal^^" Dazu konnte ich noch nichts genaueres finden >.<. EDIT: autsch, natürlich sollte ich der ordnung halber bei mm0 anfangen^^" EDIT2: Bei VAR bzw Faktor handelt es sich um Integer variablen EDIT3: OHa, oben bei der Formel muss X am ende noch durch einen 4ten Faktor geteilt werden..teilen geht per mmx wohl nicht und teilen ist ja xmal langsamer als alles zusammen o.o MFG Memnarch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 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