Re: Gleitkommadivision im Inline-Assembler
13. Dez 2007, 00:21
Zumal hier offenbar eine ganze Menge Grundlagen fehlen. Assembler von Hand zu basteln ist auch selten der erst beste Ansatz. In dem aller größten Teil aller Fälle, wo etwas scheinbar triviales auf ein mal langsam scheint, kann man am Algo an und für sich drehen. Da stecken gewöhnlich mehr als 60% des Optimierungspotentials bei komplexeren Operationen.
Eine Division ist aber auch eine elementare Operation die so direkt von der CPU bzw. FPU mit einer Anweisung durchgeführt wird, und so ziemlich jeder Compiler bekommt es noch auf die Kette diese ganz ganz grundlegenden Dinge optimal zu übersetzen.
Die einzige Chance ist wieder der Algo: Völlig abhängig von der Aufgabe eines Algos kann man hier und da grad Divisionen vermeiden oder durch geschickte Mathematik in schnellere Operationen aufdröseln, aber das ist dermaßen Problemspezifisch, dass dessen Erkennung und Durchführung automatisch eher nicht hinhaut. Ähnlich schaut es mit der Möglichkeit der parallelen Verarbeitung via MMX/SSE aus. Aber auch das sind beides zunächst einmal algorithmische Ansätze, bei denen - ausser bei MMX/SSE - kein einziges Handgeschriebenes Wort Assembler nötig ist.
Wenn irgendwann mal der Algo an und für sich ausgereizt ist, und zudem komplex genug dass ein Automat nicht eine beste Optimierung in Maschinencode schafft, dann kann man sich dran machen, und noch die letzten paar wenigen Prozente an Geschwindigkeit via Handmade-Assembler herauskitzeln. Das lohnt dann häufig mehr wenn man parallelisieren kann; als Beispiel hierfür kann man u.a. 2D-Vektoren anführen, deren elementaren Operationen man ganz hübsch mit SSE verarbeiten kann, da bei denen die 2 Koordinaten unabhängig voneinander sind, und die selben OPs mit ihnen durchgeführt werden.
Aber hier landet man ganz tief in den Details eines Algos, welcher an und für sich schon optimiert sein sollte.
Und eine einzelne Division ohne Kontext eines Algos bietet aufgrund dessen, dass sie elementar ist, genau 0 Optimierungspotential. Was Delphi da raus bringt, ist schon das best mögliche für diesen Fall.
Ich würde ausserdem etwas Lektüre zu Prozessorarchitektur/Registern und Compilern empfehlen. Dann wirst du auch schnell merken, dass dein Vorhaben hier prinzipbedingt zu nicht viel führen wird.
LG,
dizzy
Fabian K. INSERT INTO HandVonFreundin SELECT * FROM Himmel
|