Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Simd/MMX, wie funktioniert das?

  Alt 11. Mär 2011, 20:18
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat