2016-04-21 6 views
1

Ich vergleiche die Ausgänge der Signalverarbeitungsbibliothek unter Verwendung der Gleitkomma-Mathematik, die für AArch64 (ARMv8) unter Verwendung von z.B. gcc 4.9.Bitgenaue Gleitkommaberechnungen auf AArch64 mit O2 beibehalten

Unterschiede treten je nach Optimierungsstufe auf. Unoptimierte Builds (O0) berechnen bitgenaue Ergebnisse in Bezug auf eine ARMv7-Referenz. In ARMv7-Umgebungen führten O2-Builds zu keinen Abweichungen bei den Gleitkommaberechnungen. Dies ist bei ARMv8 nicht der Fall. Optimierte Builds berechnen tatsächlich ein anderes Ergebnis.

Sind Compiler-Schalter verfügbar, um Bit-Genauigkeit für nicht optimierte Builds beizubehalten?

Tests wurden mit einem DragonBoard 410c (Cortex-A53) durchgeführt.

+2

Die Hardware führt die FP Ops die gleichen aus. Die Unterschiede, die Sie sehen, sind wahrscheinlich auf die Einführung von SIMD-Operationen zurückzuführen, die die Anzahl der gesamten Gleitkommaoperationen ändern können. Wenn Sie zum Beispiel eine Liste von Zahlen einzeln hinzufügen, erhalten Sie ein anderes Ergebnis, wenn Sie sie 4 mal 4 hinzufügen und dann die letzten 4 als letzten Schritt summieren. Jede FP-Operation führt zu einem leichten Fehler; Je mehr Sie verwenden, desto größer ist der Fehler. – BitBank

+0

Ich weiß, dass Gleitkomma-Assoziativität kritisch ist. Noch Compiler für ARMv7 konnten eine bitgenaue Verarbeitung auch mit O2-aktiv sicherstellen. Dies scheint zumindest bei meinen ersten Tests auf dem DragonBoard für ARMv8 nicht der Fall zu sein. Könnte eine Hardware-Glitch- oder -Compiler-Eigenschaft (oder ein beabsichtigtes Verhalten) sein. – nucleon

+0

Die wahrscheinlichste Erklärung für die Unterschiede ist, dass Floating-Point-Register manchmal größer als beispielsweise ein "double" sind. Wenn optimiert, behält der Compiler häufig Zwischenergebnisse in Gleitkommaregistern bei, mit dem Effekt, dass das Ergebnis genauer ist als das Ergebnis, das erhalten wird, wenn die Werte im Speicher gespeichert werden. Wenn Sie 'gcc' verwenden, versuchen Sie, diese Option anzugeben:' -ffloat-store' Dies wird die meisten Optimierungen verhindern, die zu Änderungen der Gleitkomma-Ergebnisse führen könnten. –

Antwort

1

Je nachdem, welche Optionen Sie für Ihre ARMv7-A-Builds verwenden (wenn Sie -mfpu=vfpv4 oder gleichwertig verwendet haben, ist diese Antwort wahrscheinlich falsch), ist der wahrscheinlichste Unterschied die Generierung von FMA-Vorgängen.

Um dies zu vermeiden, verwenden Sie -ffp-contract=off. Die GCC documentation für diese Option sagt:

-ffp-contract=style

-ffp-contract=off deaktiviert Gleitkommaausdruck Kontraktion.

-ffp-contract=fast ermöglicht Fließkommaausdruck-Kontraktion wie als Bildung von Fused Multiply-Add-Operationen, wenn das Ziel native Unterstützung für sie hat.

-ffp-contract=on aktiviert Fließkommaausdruck Kontraktion, wenn durch den Sprachstandard erlaubt. Dies ist derzeit nicht implementiert und gleich -ffp-contract=off behandelt.

Der Standardwert ist -ffp-contract=fast.

Verwandte Themen