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.
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
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
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. –