AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Fließkommazahl oder Ganzzahl schneller zu berechnen ?
Thema durchsuchen
Ansicht
Themen-Optionen

Fließkommazahl oder Ganzzahl schneller zu berechnen ?

Ein Thema von supermuckl · begonnen am 5. Jun 2005 · letzter Beitrag vom 5. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#1

Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 03:50
Hallo.
Ich habe mir Gedanken darüber gemacht, was bei mathematischen Funktionen am schnellsten vom Prozessor verarbeitet werden kann.
Wenn ich z.B. zwei mit single deklarierte Variablen multipliziere oder sonstwas damit veranstalte und das ganze dann mit 2 integer Variablen wiederhole, was wird dann schneller sein ?

wie siehts ausserdem mit den Größen der Typen aus? braucht 32bit mehr Zeit als 16bit ?
bei 64 <-> 32 bit würde ich jetzt behaupten, das ein 32bit Prozessor bei 64Bit ca das doppelte an Zeit braucht. Aber wie sieht es zwischen 16 und 32bit aus? oder 4 und 8 bit ? was ist schneller bzw ist es gleichschnell ?

Ich arbeite halt grad an einem game, wo ich viele Variablen in mehreren Schleifen durch die Mangel dreh. Und da wäre es sinnvoll zu wissen, ob ich nun alles in single machen soll, da es evtl irgendwie schneller berechnet wird durch SSE2 oder sonstwas für CPU Techniken oder ob ich auch mal nen integer verwenden kann, ohne schlechtem Gewissen, das meine Schleife die da was multipliziert o.ä. dadurch langsamer wäre.

Ausführliche Informationen sind erwünscht

vielen Dank schonmal.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 07:24
Zitat von supermuckl:
...Ausführliche Informationen sind erwünscht
...können aber nicht geliefert werden. So was sind Erfahrungswerte, die auf konkreten Bedingungen aufbauen müssen, um diese Sachen genau zu analysieren. Oder das Ergebnis von Testreihen, die eventuell lange laufen müssen. Da kommst du nicht drum rum. 8)
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#3

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 13:35
im allgemeinen ist beim prozessor (CPU) der integer-teil schneller als die FloatingPoint unit. auf einem 32bit system sollten int16 nicht merklich schneller verarbeitet werden als int32. bei int64 gibt's (gab's) zumindest bei delphi große probleme.
die GPU (also die grafikkarte) ist auf kommazahlen optimiert und fühlt sich im allgemeinen ans bein gepinkelt, wenn man mit integern arbeiten will, also hier genau andersrum als bei der CPU.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 13:50
Grundsätzlich gilt erst einmal: Integer ist das schnellste, da immer genau so breit wie die Register, und die ALU ist schnell. Deshalb verwendet man z.T. bei sehr zeitkritischen Programmen anstelle von Floats sogenannte Festkommazahlen, die zwar Nachkommastellen haben, aber dessen gesamte Arithmetik auf Integern abgebildet wird. (Frag mich nicht wie man das im Detail macht - aber es ist imho nicht soooo schwer )

Floats: Single ist schneller als Double ist schneller als Extended. Aber Single ist schon langsamer als Integer (alles bezogen auf einfache Rechenoperationen +, -, etc.). Nun kommen so nette Ausnahmen dazu wie MMX/SSE(2). Mit MMX lassen sich Integer parallel verarbeiten. Das setzt aber voraus, dass die Problemlogik überhaupt erst einmal dazu geeignet ist parallelisiert zu werden. Eine einfach Addition bleibt eine einfach Addition. Will man aber 3 oder 4 davon in ähnlicher Weise machen, dann kann MMX schneller sein. Manko: MMX nutzt den FPU-Registerstack, und somit muss, sofern auch mit Floats geabrbeitet wird, dieser erst gesichert werden, dann der Modus gesetzt werden, und zum Ende wieder alles zurück. Also lohnt sich der Einsatz von MMX erst dann, wenn du ein parallelisierbares Problem hast, und dieses oft hinterenander, so dass du nicht immer die FPU umschalten musst.
Es kann je nach Problem aber trotz vielem Umschalten einen Vorteil erbringen. Es ist nur sehr individuell.

SSE ist für die Parallelisierung von Rechnungen mit Singles, und SSE2 mit Double, und es gelten die gleichen Umstände wie für MMX. Aber diese 3 unterscheiden sich nicht NUR durch den Datentyp, sondern bieten auch unterschiedliche Methoden. Dazu wäre es sinnvoll sich mal die IA32-Specs durchzulesen, um abschätzen zu können wo eine echte Ersparnis möglich wäre.


Ich selbst habe bisher noch keine der o.g. Erweiterungen eingesetzt, einfach weil mir der Lernaufwand bisher zu groß war. Im Zuge von .NET macht es aber auch keinen Sinn mehr sich damit zu beschäfigen, da der .NET-Compiler ohnehin versucht an geeigneten Stellen die verfügbaren Features wie MMX einzusetzen. (Dennoch bin auch ich an leicht verständlichen Anfänger-Tutorials dazu interessiert )

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von skyobserver
skyobserver

Registriert seit: 18. Mai 2005
Ort: Ense
114 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 15:23
Thema MMX, SSE, SSE2, SSE3...

Ich habe eine Assembler-Prozedur geschrieben um ein Bild aufzuhellen.
Dazu muß man nur auf die einzelnen Farbanteile jedes Pixels einen festen
Wert aufaddieren. Nachdem ich den Code eine Woche! lang optimiert habe,
bin ich auf eine passende MMX-Funktion gestossen:

Jetzt braucht meine Prozedur nur noch 45% der Zeit!
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 15:39
@dizzy: Ich dachte, Extended ist der native Datentyp der FPU. Dann wäre Extended am Schnellsten... Ich habe hier mal ein Testprogramm geschrieben.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var
  i : Integer;
  s : Single;
  r : Real;
  e : Extended;
  t : Cardinal;
begin
  s := 0;
  t := GetTickCount;
  For i:=1 To 1000000 do s:= s+ sin(i)*s/i;
  memo1.lines.add ('Single : '+IntToStr (GetTickCount - t)+' '+FloatToStr (s));
  r := 0;
  t := GetTickCount;
  For i:=1 To 1000000 do r := r+ sin(i)*r/i;
  memo1.lines.add ('Real : '+IntToStr (GetTickCount - t)+' '+FloatToStr (r));
  e := 0;
  t := GetTickCount;
  For i:=1 To 1000000 do e := e+ sin(i)*e/i;
  memo1.lines.add ('Extended : '+IntToStr (GetTickCount - t)+' '+FloatToStr (e));
end;
Danach wäre Extended #1, gefolgt von real, dann single. Lässt man den trigonometrischen Müll weg, ist Real#1, Extened #2. Scheint also auch auf die verwendeten Funktionen anzukommen (wer hätte das gedacht)...

Wenn Du Integer für Realzahlbrechnungen benutzen willst, dann definierst Du dir einfach willkürlich die Anzahl der Nachkommastellen. Das ist dann nicht mehr 'floating' point, sondern einfach 'fixed' point. Arithmetik. Bei den Grundrechenarten ist das völlig transparent, weil es ja egal ist, ob ich 1,2345 - 5,678 oder 12345 - 56780 rechne. Bei Division gibt es dann Probleme. Wenn ich fest 5 Dezimalstellen habe, und 2,00000 / 1,0000 rechnen will, wären das mit der fixed point Schreibweise 200000/100000=2 ==> 0,00002 . Also völliger Blödsinn. Da
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 17:11
Zitat von alzaimar:
@dizzy: Ich dachte, Extended ist der native Datentyp der FPU. Dann wäre Extended am Schnellsten... Ich habe hier mal ein Testprogramm geschrieben.
Ist ja nicht so, dass ich das nicht auch schon einmal getan hätte . Jedoch ist dort nur eine einfach Addition getestet.
\\edit: Es ist zudem noch anzumerken, dass ich damals noch nicht wusste, dass der FPU-Registerstack eigentlich 80 und nicht 64 Bit breit ist, wie ich es dort fälschlicherweise geschrieben habe .

@skyobserver: Genau für soetwas ist MMX entwickelt worden, und es macht - wie man sieht - bei einer solchen Aufgabe auch Sinn.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#8

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 18:16
Man sollte auch einmal erwähnen, dass solche Überlegungen das letzte sind, über das man sich in der Entwicklung eines Spiels Gedanken machen sollte. Grundrechenarten führen heutige CPUs so flitzeschnell aus, dass man sich eher auf andere Aspekte des Programms konzentrieren sollte, bevor man solche Mikro-Optimierungen betreibt.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 18:18
@dizzy: Hätte mich auch gewundert, wenn Du sowas ungetestet von Dir gibst.

Hat sich schon mal jemand die Mühe gemacht, die einzelnen Funktionen zu vergleichen? Hast Du dir überhaupt die Mühe gemacht, meinen Schwachsinn zu überprüfen? Nein? Solltest Du aber, is nämlich falsch. Richtig ist, was Du gesagt hast

@Oxmyx: Völlig richtig. Ersten denken, dann planen, dann coden, dann testen, dann optimieren.
Angehängte Dateien
Dateityp: rar testfloat_203.rar (190,8 KB, 8x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Fließkommazahl oder Ganzzahl schneller zu berechnen ?

  Alt 5. Jun 2005, 19:06
Zitat von alzaimar:
Hast Du dir überhaupt die Mühe gemacht, meinen Schwachsinn zu überprüfen? Nein? Solltest Du aber, is nämlich falsch. Richtig ist, was Du gesagt hast
Die Mühe hab ich mir erspart - ich wusste ja dass das falsch war

Ich hatte nur "+" getestet. Mit anderen Operationen könnte es aber eventuell noch Überraschungen geben! Am besten wäre es, wenn man seine konkrete "Formel" zeitlich ausmisst, und danach in Einzelfällen das optimale umzusetzen. Dass das nicht unbedingt wenig Aufwand sein muss, ist hoffentlich klar .

@Oxmyx: Vollkommen korrekt. Allerdings sind irgendwann auch die Verfahren/Konzepte ausgereizt, so dass (fast) nur noch solch eine friemelige Optimierung Besserung hervorbringt (an solch einer Stelle bin ich mit meinem aktuellen Projekt nämlich auch grad ).
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz