FPU deterministisch einstellen
-
Hi,
ich habe ein Windows Programm, das viel Gleitkommaarithmetik betreibt und unbedingt deterministisch sein muss. D.h. es soll auf allen Rechnern mit der gleichen Eingabe auch das gleiche Ergebnis ausgeben.
Jetzt ist es ja so, dass Intel intern mit 80 Bit, AMD aber nur mit 64 Bit rechnet. Ich benutze zwar nur floats, aber da wird beim Runden sicher manchmal was Unterschiedliches rauskommen.
Die eigentliche Frage ist jetzt, ob sich das Problem mit dem Einstellen des "floating-point control word" lösen ließe.
Ich denke mir, wenn ich die interne Präzision auf 24 Bit (damit ist wohl die Mantisse gemeint) stelle dann läuft es nicht nur schön schnell sondern es sollte auch immer das Gleiche rauskommen.
Naja alles vage Vermutungen, ich finde zu dem Thema leider garnichts Brauchbares.
-
Hi
Wieso sollte beim runden von genaueren Zahlen auf eine ungenauere etwas anderes rauskommen?
von 64 bit auf 32bit oder von 80bit auf 32bit sollten die 32 bit zahlen doch gleich sein. Ich wüste nicht woher da ein Rundungsunterschied kommen könnte.gruss
-
die fpu rechnet zwar intern mit hoeherer genauigkeit, rundet die ergebnis per default aber auf 64bit praezision.
dieses verhalten kann man im control word definieren.
-
Ich weiß es auch nicht genau, hab nur öfters gelesen dass es so sein soll.
Aber mal angenommen es gibt in dem Programm eine Stelle, in der mit einer Variablen sehr lange gerechnet wird ohne dass sie zwischengespeichert und damit gerundet wird. Dann könnte unter umständen schon was anderes auf der letzen Kommastelle rauskommen.Die Frage ist jetzt eben, ob alle CPU's exakt gleich rechnen wenn man sie mit dem control word auf einfache Genauigkeit umstellt (d.h. 32 Bit interne Präzision). Diese Information konnte ich nirgends finden, auch unter hellihjbs Link nicht. Habt ihr vielleicht Links zu Seiten/Papieren die da genauer drauf eingehen?
-
0x00000001 schrieb:
Jetzt ist es ja so, dass Intel intern mit 80 Bit, AMD aber nur mit 64 Bit rechnet.
wenn du sie mit dem selben code fütterst, werden sie auch exakt das selbe berechnen. davon ausgehend, erschließt sich die fragestellung nicht. und soweit es um hochsprachen geht, ist die problematik ohnehin eine andere.
-
es ist ja so, dass Intel intern mit 80 Bit, AMD aber nur mit 64 Bit rechnet
das stimmt nicht. wahrscheinlich beziehst du dich auf die 64bit floating-point register der amd64-architektur?
diese werden ausschliesslich fuer sse-operationen verwendet.
zusaetzlich befindet sich, wie schon immer, eine ganz normale fpu im prozessor.
deren ergebnisse sind dank ieee klar definiert.
die ergebnisse koennen allerdings dann abweichen, wenn du deinen code einmal fuer fpu und einmal fuer sse compilierst.
-
Achso. Wenn sich das Problem nur auf SSE bezieht, dann kann ich das auch abschalten.
Außerdem werd ich einfach mal einen Benchmark programmieren, der das Programm ein paar Minuten rechnen lässt und das Endergebnis überprüft (es ist ein Spiel, deßhalb nicht so einfach).Danke für die Hilfe.