Fast inverse square root
Übersicht

sinjinBetreff: Fast inverse square root |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe diesen Source-Code genommen und den in BMAX umgewandelt, habe mich damit nicht super beschäftigt und musste am Ende noch 1/x rechnen (edit: klar, wegen INVERSED) aber es funktioniert:
Code: [AUSKLAPPEN] function qsqr#(src#)
local x2#=src*0.5 local i%=$5f3759df-(int ptr(varptr(src))[0] shr 1) src=float ptr(varptr(i))[0] src:*(1.5-(x2*src*src)) return 1/src endfunction |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
~VERSCHOBEN~ Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde. Normalerweise würde ich ja vorschlagen, den Code zu kommentieren - aber in diesem Fall reicht eigentlich die Quellenangabe. Der Originalcode ist auch nicht sonderlich hübsch kommentiert. mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo.
Habe schon lange nach einer schnellen Berechnung der Queadratwurzel gesucht. ![]() Mir würde auch interessieren um wie viel schneller die Berechnung im Gegensatz zur herkömmlichen ist. Mfg Matz |
||
sinjin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Steht alles auf der Wiki-Seite. Ungefähr 4x. | ||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jein.
Es gibt zwei Gründe, warum der fast inverse square root schneller ist, als die normale Berechnung. Erstens, es benötigt keine Float-Berechnungen, die auf alten Geräten ohne FPU langsam waren. Zweitens, man muss nicht dividieren um auf 1/sqr(x) zu kommen, was das tatsächliche Ziel des Ganzen ist. Der erste Grund hat sich lange erledigt. Jeder Prozessor (also für Computer und Handies verwende Prozessoren sind hier gemeint) aus diesem Jahrtausend hat eine FPU, da sind dann Float-Berechnungen nicht langsamer als Int-Berechnungen. Den zweiten Grund machst du mit deiner Methode zunichte, indem du am Ende wieder dividierst. Dazu kommt, dass du hier nicht in Assembler oder C programmierst, und damit noch einen Haufen Overhead dazu kommt, z.B. durch den Funktionsaufruf. Ich hab deswegen mal einen Geschwindigkeitstest gemacht: BlitzMax: [AUSKLAPPEN] Framework BRL.StandardIO Das Resultat ist Folgendes: Code: [AUSKLAPPEN] Normal: 44
Fast: 346 Fast Direct: 124 Das heißt, sqr() ist fast 8 mal schneller als qsqr(). Ruft man den Inhalt von qsqr() direkt auf, also ohne einen Funktionsaufruf darum, dann ist es nur mehr sqr() nur mehr 3x so schnell. Verändert man den Code so, dass nicht die Wurzel sondern die inverse Wurzel berechnet wird, wie es in dem Algo sein sollte, dann kriegt man Folgendes als Ergebnis: Code: [AUSKLAPPEN] Normal: 94
Fast: 292 Fast Direct: 127 Das heißt, dank FPU ist 1/sqr(x) immer noch 3x schneller als iqsgr(x) und immer noch 30% schneller als wenn der Code ohne Funktion aufgerufen wird. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Results may vary.
Code: [AUSKLAPPEN] Normal: 260
Fast: 159 Fast Direct: 150 |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe mal ein altes Notebook ausgegraben und DAK's Beispiel noch erweitert.
Ich habe eine Funktion in Assembler hinzugefügt, die den SSE-Befehl SQRTSS verwendet: Code: [AUSKLAPPEN] Normal: 591
Fast: 495 Fast Direct: 308 SSE: 220 (getestet auf einem Intel Celeron-M mit 1,3 GHz) BlitzMax: [AUSKLAPPEN] Framework BRL.StandardIO Assemblerdatei sse_sqrt.s: Code: [AUSKLAPPEN] ; Linux & Mac
format ELF ; Windows: ; format MS COFF public sqrt_ss sqrt_ss: sqrtss xmm1, dword [esp+4] push eax movss [esp], xmm1 fld dword [esp] pop eax ret |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
- Zuletzt bearbeitet von Thunder am Mo, Sep 14, 2015 1:07, insgesamt einmal bearbeitet
![]() |
Lord Stweccys |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] Normal: 88
Fast: 114 Fast Direct: 89 SSE: 53 |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessant, das die Werte scheinbar so stark variieren. Worum es mir hauptsächlich ging, war zu sagen, dass 4x so schnell als fixer Wert nicht passt.
Was für CPUs habt ihr? Ich habe hier einen i7-3626QM @ 2.2 GHz. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
sinjin |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] Normal: 125
Fast: 113 Fast Direct: 78 SSE: 60 Habe einen I5 @ 2.67 GHz. Cool Thunder, habe schon sämtlichen Code mit der SSE-Routine ausgetauscht. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group