Frage

Ich schreibe eine Anwendung, die einige einfache Operationen mit ihnen große Anordnungen von Schwimmern und führt liest. Ich bin mit Schwimmern, weil ich dachte, es schneller als verdoppelt würde, aber nach einigen Recherchen habe ich festgestellt, dass es einige Verwirrung über dieses Thema. Kann jemand auf diese näher erläutern?

War es hilfreich?

Lösung

Die kurze Antwort lautet: „Einsatz je nachdem, welche Präzision für akzeptable Ergebnisse erforderlich ist.“

Sie eine Garantie dafür, dass Operationen an Gleitkommadaten ausgeführt in mindestens höchsten Präzision Mitglied des Ausdrucks fertig ist. So Multiplikation zweier float 's mit mindestens der Genauigkeit von float , und Multiplizieren eines float fertig ist und eine Doppel würde mit mindestens doppelter Genauigkeit durchgeführt werden. Der Standard legt fest, dass „[Gleitkommazahlen] Operationen mit höherer Genauigkeit kann Art der Operation als das Ergebnis durchgeführt werden.“

Da der JIT für .NET versucht, Ihre Gleitkommaoperationen in der Präzision verlassen Wunsch können wir für die Beschleunigung unserer Operationen einen Blick auf Dokumentation von Intel nehmen. Auf der Intel-Plattform kann Ihre Gleitkommaoperationen in einer Zwischen Genauigkeit von 80 Bit durchgeführt werden und umgerechnet bis auf die Präzision gefordert.

Von Intel Leitfaden für C ++ Gleitkommaoperationen 1 (sorry nur toten Baum), sie erwähnen:

  
      
  • Verwenden Sie eine einfache Genauigkeit Typ (zB float), es sei denn die zusätzliche Präzision durch doppelte oder lang doppelt erhalten erforderlich. Mehr Präzision Typen erhöhen die Speichergröße und Anforderungen an die Bandbreite.   ...
  •   
  • Vermeiden Sie gemischten Datentyp arithmetische Ausdrücke
  •   

Der letzte Punkt ist wichtig, da Sie verlangsamen sich nach unten mit unnötigen Würfe zu / von float und double , die in JIT'd Code zur Folge haben, die die x87 von seiner 80-Bit-Zwischenformat zwischen Operationen!

zu werfen fordert weg

1. Ja, sagt sie C ++, aber der C # Standard plus Wissen des CLR läßt uns die Informationen wissen für C ++ sollte in diesem Fall anwendbar sein.

Andere Tipps

Ich habe gerade gelesen die "Microsoft .NET Framework-Application Development Foundation 2." für die MCTS-Prüfung 70-536 und es gibt einen Hinweis auf Seite 4 (Kapitel 1):

  

Hinweis Optimierung der Leistung mit eingebauten Typen
  Die Laufzeit optimiert die Leistung der 32-Bit-Integer-Typen (Int32 und UInt32), so dass diese Typen für Zähler und andere häufig zugegriffen Integralvariablen verwenden. Für Gleitkommaoperationen ist doppelt die effizienteste Art, da diese Operationen durch Hardware optimiert sind.

Es wird von Tony Northrup geschrieben. Ich weiß nicht, ob er eine Autorität ist oder nicht, aber ich würde erwarten, dass das offizielle Buch für die .NET-Prüfung sollte etwas an Gewicht tragen. Es ist natürlich nicht ein gaurantee. Ich dachte nur, ich es zu dieser Diskussion hinzufügen würde.

Ich profilierte eine ähnliche Frage vor ein paar Wochen. Unterm Strich ist, dass für x86-Hardware gibt es in der Leistung des Schwimmer kein signifikanter Unterschied im Vergleich zu verdoppeln, wenn Sie Speicher gebunden werden, oder Sie starten in der Cache-Problem ausgeführt wird. In diesem Fall schwimmt hat in der Regel den Vorteil, weil sie kleiner sind.

Aktuelle Intel-CPUs führen alle Gleitkommaoperationen in 80 Bit breite Register, so dass die tatsächliche Geschwindigkeit der Berechnung nicht zwischen Schwimmern und Doppelzimmer.

variieren sollte

Wenn Last & Speicheroperationen den Engpass sind, schwimmt dann schneller sein, weil sie kleiner sind. Wenn Sie eine erhebliche Anzahl von Berechnungen zwischen Lade- und Speichervorgänge zu tun, sollte es etwa gleich sein.

Jemand erwähnte sonst Konvertierungen zwischen Schwimmer zu vermeiden und Doppel und Berechnungen, die Operanden beiden Typen verwenden. Das ist ein guter Rat, und wenn Sie die Mathematik-Bibliothek Funktionen, die verdoppelt (zum Beispiel) zurück, dann alles als verdoppelt halten wird schneller sein.

Ich bin ein Raytracer zu schreiben, und das Ersetzen der Schwimmer mit Doppel für meine Color-Klasse gibt mir eine 5% Speedup. Die Vektoren Ersetzen mit Doppel Schwimmer ist ein weiteres 5% schneller! Ziemlich cool:)

Das ist mit einem Core i7 920

Mit 387 FPU Arithmetik, Schwimmer ist nur schneller als das Doppelte für bestimmte lange iterative Operationen wie pow, lügt, etc. (und nur dann, wenn der Compiler setzt das FPU-Steuerwort entsprechend).

Mit gepackten SSE Arithmetik, es macht einen großen Unterschied though.

Matthijs,

Sie sind falsch. 32-Bit-weit effizienter als 16-Bit -. In modernen Prozessoren ... Vielleicht nicht Speicher-weise, aber in der Wirksamkeit 32-Bit ist der Weg zu gehen

Sie sollten wirklich Ihren Professor, um etwas mehr "up-to-date" aktualisieren. ;)

Wie auch immer, die Frage zu beantworten; float und double hat genau die gleiche Leistung, zumindest auf meinem Intel i7 870 (wie in der Theorie).

Hier sind meine Messungen:

(Ich machte einen „Algorithmus“, die mich für 10 Millionen mal wiederholt und wiederholt dann, dass 300-mal für und aus, dass ich durchschnittlich gemacht.)

double
-----------------------------
1 core  = 990 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms

float
-----------------------------
1 core  = 992 ms
4 cores = 340 ms
6 cores = 282 ms
8 cores = 250 ms

Dies zeigt, dass Schwimmer ist etwas schneller als verdoppelt: http://www.herongyang.com /cs_b/performance.html

Im Allgemeinen kann jedes Mal, wenn Sie einen Vergleich über die Leistung zu tun, sollten Sie alle Sonderfälle berücksichtigt werden, wie funktioniert ein Typ mit erfordern zusätzliche Umbauten oder Daten Massieren? Diejenigen, addieren und allgemeine Benchmarks wie diese Lüge erklären kann.

sollte Floats schneller auf einem 32-Bit-System, aber den Code Profil zu machen, dass Sie das Richtige sind zu optimieren.

Ich habe immer gedacht, dass die Prozessoren optimiert wurden oder die gleiche, unabhängig von float oder double. Die Suche nach Optimierungen auf meinen intensiven Berechnungen (viel bekommt aus einer Matrix, Vergleiche von zwei Werten) fand ich heraus, dass schwebt etwa 13% schneller laufen.

Das überraschte mich, aber ich denke, es ist die Art meines Problems zurückzuführen ist. Ich mache keine Abgüsse zwischen Schwimmer und Doppel im Kern der Operationen, und meine Berechnungen sind vor allem das Hinzufügen, Multiplizieren und Subtrahieren.

Dies ist auf meinem i7 920, ein 64-Bit-Betriebssystem ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top