Optimierungen für double/float
-
Hallo,
welches Format ist zu bevorzugen, wenn mir theoretisch einfache Genauigkeit reicht, ich jedoch auf effizienten Code hinaus will.
Stichworte: 4-Byte-Alignment im Speicher, Caching, 64bit-CPU etc
Im Prinzip geht es mir um die Zugriffs- und Berechnungsoptimierung auf Arrays zwischen 10 und einigen hundert MByte im Speicher (bzw doppelter Größe bei double).
Die Einsatz- und Entwicklungsumgebung ist hauptsächlich Linux, muss jedoch auch auf Win laufen. Ich hoffe mal, dass die Frage nicht unbedingt OS-abhängig ist.
Danke für eure Erfahrungen
C
-
Bei so einer Größe nimmst du besser die einfache Genauigkeit! Wenn's auf einige hundert MB hinausläuft, wird afair sowieso ein Großteil der Pages auf die Festplatte gepackt und bei Bedarf wieder in deinen Programmspeicher geladen. Bei doppelt so großen Datenmengen muss doppelt so oft ge-paged werden, was dann wohl auf Geschwindigkeitsverlust hinausläuft; das etwas suboptimalere Alignment kannst du da meiner Meinung nach vernachlässigen

-
RAM ist kein Problem
Da wird idR nix geswappt, sonst würde ich mir auch keine Sorgen machen.Ich ergänze mal meine Frage, inwiefern sich doubles lohnen würden, bei normalen Funktionsaufrufen, Bsp:
void function(double a, double b, double c, double d, double e, double f, double g, double h, double i, double j, double k);Jetzt mal von Geschichten wie Referenzen etc abgesehen, würde es Geschwindigkeit bringen, hier nur mit floats zu arbeiten. Angenommen natürlich, function ist eine sehr kurze Methode, wird jedoch sehr häufig aufgerufen.
-
Wie wärs, wenn du es einfach mal ausprobierst? Auf der einen Plattform könnte float schneller verabeitet werden als double, auf einer anderen wäre es umgekehrt, auf einer dritten macht es womöglich keinen Unterschied.
-
Bau dir doch mal ein kleines Beispiel auf (Am besten templateisiert), dann kompile es einmal als float, einmal als double, und dann noch einmal mit SSE2 als float und double.
Meine Prognose:
ohne SSE2 float 20 ms
ohne SSE2 double 100 ms
mit SSE2 float 3 ms
mit SSE2 double 2.5 msKannst du aber nur durch ausprobieren rausfinden.
-
Also ich habs mal überwiegend mit floats versucht. Ergebnis: 10% schneller (ca 20 zu ca 22min). Mein Fazit: lohnt nicht, im Vergleich zum erhöhten Speicherbedarf bei double (der Produktiv-Rechner wird wahrscheinlich schwächer sein, als meiner).
Die SSE2-Optimierungen sollten doch wohl -- sofern nutzbar -- automatisch aktiviert sein, lt. Compilerbeschreibung (GCC 4.1.2)??
-
crashterpiece schrieb:
Also ich habs mal überwiegend mit floats versucht. Ergebnis: 10% schneller (ca 20 zu ca 22min). Mein Fazit: lohnt nicht, im Vergleich zum erhöhten Speicherbedarf bei double (der Produktiv-Rechner wird wahrscheinlich schwächer sein, als meiner).
wtf?
-
es lohnt sich nicht, weil der rechner, auf dem das tool laufen soll nicht dermassen viel RAM hat, so dass mehr geswappt wird (s.o.) und der vorteil wieder flöten geht.
bei einer steigerung von vielleicht 20-30% und mehr hätte ich jedoch das swapping in kauf genommen.
-
Aber floats brauchen doch nur halb so viel Speicher wie doubles..? Oder hab ich da was falsch verstanden?

-
öhh, dann hab ichs wohl missverständlich geschrieben
also floats sind kleiner und schneller --

-
Wenn man mit der float Genauigkeit auskommt sollte man floats nehmen, so Einfach ist das IMO

Wenn man natürlich die Genauigkeit von double braucht ... dann muss man eben doubles nehmen - dann stellt sich die Frage aber nichtmehr.Wie schon geschrieben wurde sind floats kleiner, und gerade wenn man mit grossen Datenmengen rechnet kann das einen grossen Unterschied machen - nicht nur wegen Swapping sondern auch wegen der Caches. Natürlich ist es nie ein Fehler Benchmarks zu machen, denn es könnte ja sein dass wider alle Erwartungen irgendwas mit doubles schneller ist.