![]() |
Einfache Funktion in asm übersetzen...
Delphi-Quellcode:
Ich bräuche asm Version dieser Funktion. Wer kann helfen ? Danke.
function VectorLength( const v:array of single ):single;
begin Result := sqrt (v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); end; |
Re: Einfache Funktion in asm übersetzen...
Setze da doch einfach einen Haltepunkt hin und schau dir zur Laufzeit da die CPU ansicht an, da steht der asm Code, glaube ich..
|
Re: Einfache Funktion in asm übersetzen...
Bist du sicher, dass du wirklich asm brauchst? Wenn's dir nur um die Geschwindigkeit geht, wirst du da gegenüber einem modernen Compiler wie Delphi nicht mehr viel rausholen können.
|
Re: Einfache Funktion in asm übersetzen...
Bei diser Funktion ist die Geschwiendigkeitsgewinn gering, aber sonst gibt es immer ein Geschwindigkeitsgewinn.
|
Re: Einfache Funktion in asm übersetzen...
Das wollte ich ja auch gar nicht anzweifeln. Bloß ist mittlerweile der von Compilern erzeugte Code schon so weit optimiert, dass im Allgemeinen (also nicht nur bei diesem Beispiel) nur noch geringe Geschwindigkeitsvorteile erzielt werden können. Da muss man dann halt wissen, ob einem das noch den Aufwand wert ist.
|
Re: Einfache Funktion in asm übersetzen...
guck dir im debugger erstmal an, was der compiler aus der funktion macht.
das kannst du ja hier mal posten. eventuell ist das auch schon die optimierteste variante. (kein debug=build, auf release-build stellen!) |
Re: Einfache Funktion in asm übersetzen...
Ich versuch mal mein Glück, muss aber auf keinen Fall stimmen. Das letzte mal, das ich FP-Routinen in Assembler geschrieben hab ist schon ne Weile her ;)
Delphi-Quellcode:
function VectorLength(const v:array of single ):single;
asm fld dword ptr [eax] fmul st(0), st(0) fld dword ptr [eax+4] fmul st(0), st(0) fld dword ptr [eax+8] fmul st(0), st(0) fadd fadd fsqrt end; |
Re: Einfache Funktion in asm übersetzen...
... wird so nicht klappen, du hast die Additionen vergessen!
|
Re: Einfache Funktion in asm übersetzen...
Habs grad gemerkt und korrigiert :)
|
Re: Einfache Funktion in asm übersetzen...
Ich würde "faddp" benutzen, dann bleibt aufm FPU-Stack nachher nix über. Ich weiss nicht ob das schlimm wäre, aber folgende Variante verrichtet bei mir oft und gut ihre Arbeit:
Delphi-Quellcode:
Und du hast die Zuweisung an Result vergessen ;).
function VectorLength(const v:array of single ):single;
asm fld dword ptr [eax] fmul st(0), st(0) fld dword ptr [eax+4] fmul st(0), st(0) fld dword ptr [eax+8] fmul st(0), st(0) faddp faddp fsqrt fstp result; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:24 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 by Thomas Breitkreuz