Frage

einige Programme in C, das tut umfangreiche Fließkommaberechnungen richtige Ergebnisse auf einer PC Linux-Box, aber falsche Ergebnisse auf der SPE des Zellprozessors, aber nicht auf der PPU der Zelle. Ich bin mit gcc-Compiler. Ich frage mich, ob es eine gcc Kompilierungsoption ist Rundungsmethode oder ähnliches zu erhöhen, so ich Schwimmer Präzision Berechnungen mit mehr Präzision bekommen. Ich kann nicht drastisch reduzieren würde zu verdoppeln, wie auf der SPE Leistung ändern

Danke

War es hilfreich?

Lösung

Auf der Basis des IBM Dokumentation für die Unterschiede von IEEE 754 auf dem SPU , könnte es eine beliebige Anzahl von Dingen:

  • Null Ergebnisse aus arithmetischen Operationen sind immer 0, nie -0.
  • normalisierter Eingänge 2-149 bis 2-126 zu arithmetischen Operationen behandelt werden als Null mit dem gleichen Vorzeichen. Arithmetik Operationen produzieren nie denormal Ergebnisse, sondern produzieren +0 statt.
  • Rechenoperationen unterstützen IEEE Inf oder NaN nicht. Diese Bitmuster repräsentieren gültige Zahlen. Überlauf Ergebnisse erzeugen die maximale Größe Wert des entsprechenden Zeichens.
  • Die arithmetischen Operationen verwenden nur die Rund-um-zu-Null (Kotelett, truncate) Rundungsmodus, unabhängig von der Einstellen des Rundungsmodus in der Floating-Point-Status und Steuerung Register (FPSCR), die nur wirkt doppelte Genauigkeit arithmetische Operationen.

Natürlich auf einer verwandten Seite, Sie können auch Kompilierung SPU-Code für strenge IEEE Konformität :

In der Standardeinstellung XL C / C ++ folgt die meisten, aber nicht alle Regeln in der IEEE Standard. Wenn Sie kompilieren mit der -qnostrict Option, die standardmäßig bei Optimierungsstufe aktiviert ist O3 oder höher, einige IEEE Floating-Point-Regeln wird in einer Weise verletzt, die verbessern Leistung, sondern könnte Programm beeinflussen Richtigkeit. Um zu vermeiden, um dieses Problem, und für die strikte Einhaltung zu kompilieren mit Der IEEE-Standard, gehen Sie wie folgt vor:

  • Verwenden Sie die -qfloat = nomaf Compiler-Option.
  • Wenn das Programm den Rundungsmodus zur Laufzeit ändert, verwenden Sie die -qfloat = RRM Möglichkeit.
  • Wenn die Daten oder Programmcode Signalisierung enthält NaN-Werte (Nans), verwenden Sie die -qfloat = Nans Option. (A-Signalisierung NaN unterscheidet sich von einer ruhigen NaN; Sie muss sie explizit in den Code Programm oder Daten oder erstellen Sie es durch die Verwendung die -qinitauto Compiler-Option).
  • Wenn Sie mit O3 kompilieren, -O4 oder -O5, beinhalten die Option -qstrict nach.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top