{"id":3053,"date":"2017-06-05T13:14:36","date_gmt":"2017-06-05T12:14:36","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3053"},"modified":"2017-06-05T14:34:32","modified_gmt":"2017-06-05T13:34:32","slug":"c-guns-barteks-coding-blog-float-vs-double-uberpruft","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3053","title":{"rendered":"C++ Guns - Bartek's coding blog - Float vs Double - \u00dcberpr\u00fcft"},"content":{"rendered":"<p>Wieder so ein C++ Blog, der aber in Wahrheit schei\u00df C Code verbreitet. Und dann erz\u00e4hlt er auch noch die H\u00e4lfte und macht unvollst\u00e4ndige Angaben zu seinen Tests.<\/p>\n<p>Es geht in dem Artikel darum, dass viele denken, dass floats kleiner und schneller als doubles sein. Kleiner sind sie, ja. Verbrauchen nur 4 Byte statt 8 Byte. Aber schneller sind sie nicht unbedingt. Sollten doch unsere heutigen CPUs mit gen\u00fcgen Hardware ausgestattet sein, um auch 64 Bit Zahlen genauso schnell zu verarbeiten. Na, wir werden sehen...<\/p>\n<p>Endergebnis f\u00fcr ungeduldige:<br \/>\nF\u00fcr kleine Datenmengen und IEEE Gleitkommazahlen verhalten sich bei meinen Tests floats und doubles gleich.<br \/>\nVerzichtet man auf Standard Zahlen und aktiviert fancy Optimierungen, wird man mit einem 1.5 bis 3.5-fachen schnelleren Programm belohnt, welches falsche Ergebnisse liefern kann.<br \/>\nF\u00fcr gro\u00dfe Mengen sieht die Sache anders aus. Dann wird der RAM Bus zum Flaschenhals.<\/p>\n<p>Im ersten Teil \u00fcbernehme ich sein Code und versuche die selben Ergebnisse zu erzielen. Im zweiten Teil schreibe ich das ganze nach C++ um. Leider gibt er nicht an, wie gro\u00df das Array sein soll und wie viele Iterationen gerechnet werden sollen. Also hab ich mal irgendwas eingestellt um ein paar Sekunden Laufzeit zu bekommen. Wenn man wie im original Artikel nur unter einer Sekunde misst, ist die Varianz zu hoch, und man wei\u00df gar nichts.<\/p>\n<p>Testfall:<br \/>\nAMD Athlon(tm) 64 X2 Dual Core Processor 4800+<br \/>\n32Bit Debian<br \/>\ng++ 6.3.0<br \/>\nARR_SIZE = 200000<br \/>\nNUM_ITER = 20000<\/p>\n<p>Die Standardeinstellung f\u00fcr 64 Bit Systeme mit Optimierung ist SSE. Ich werde daher explizit auf den floating-point Coprozessor mit der Option -mfpmath=387 umschalten. F\u00fcr SSE werde ich die Option -mfpmath=sse -msse2 benutzen. <\/p>\n<p>Die Option -ffast-math kann \u00fcbrigens falsche Ergebnisse liefern. Die exakten Vorgaben der IEEE Spezifikationen werden nicht eingehalten. Daf\u00fcr sollte man ein schnelleres Programm haben.<\/p>\n<p>Mittelwert von drei Berechnungen pro Einstellung. Alle Angaben in Sekunden.<\/p>\n<table frame=box rules=all>\n<tr>\n<td><\/td>\n<td>-O3 -mfpmath=387<\/td>\n<td>-O3 -mfpmath=sse -msse2<\/td>\n<td>-O3 -mfpmath=387 -ffast-math<\/td>\n<td>-O3 -mfpmath=sse -msse2 -ffast-math<\/td>\n<\/tr>\n<tr>\n<td>float<\/td>\n<td>6.54<\/td>\n<td>6.56<\/td>\n<td>6.52<\/td>\n<td>2.01<\/td>\n<\/tr>\n<tr>\n<td>double<\/td>\n<td>6.61<\/td>\n<td>6.78<\/td>\n<td>6.54<\/td>\n<td>4.54<\/td>\n<\/tr>\n<\/table>\n<p>Also, dasss floats schneller sind als doubles, oder dass doubles schneller sind als floats kann ich in diesem Testfall nicht best\u00e4tigen. Bei mir sind sie im Grunde gleich schnell. Nur die Option -ffast-math bewirkt eine Geschwindigkeitsverbesserung um das 3-fache bzw. 1.5-fache. <\/p>\n<p>Aber das kann von CPU zu CPU anders sein. Vor allen von microshit zu GNU.<\/p>\n<p>Testfall 2:<br \/>\nIntel(R) Atom(TM) CPU N270   @ 1.60GHz<br \/>\n32 Bit Debian<br \/>\ng++ 4.9.2<br \/>\nARR_SIZE = 200000<br \/>\nNUM_ITER = 20000<\/p>\n<p>Mittelwert von drei Berechnungen pro Einstellung. Alle Angaben in Sekunden.<\/p>\n<table frame=box rules=all>\n<tr>\n<td><\/td>\n<td>-O3 -mfpmath=387<\/td>\n<td>-O3 -mfpmath=sse -msse2<\/td>\n<td>-O3 -mfpmath=387 -ffast-math<\/td>\n<td>-O3 -mfpmath=sse -msse2 -ffast-math<\/td>\n<\/tr>\n<tr>\n<td>float<\/td>\n<td>21.1<\/td>\n<td>18.9<\/td>\n<td>21.1<\/td>\n<td>6.19<\/td>\n<\/tr>\n<tr>\n<td>double<\/td>\n<td>22.2<\/td>\n<td>22.2<\/td>\n<td>22.2<\/td>\n<td>31.6<\/td>\n<\/tr>\n<\/table>\n<p>Durch den Sparstrumpf Prozessor zeigt sich insgesamt eine h\u00f6here Laufzeit. Floats und doubles sind wieder in etwa gleich schnell. Nur die -ffast-math Option macht einen Unterschied. F\u00fcr floats eine Verbesserung der Laufzeit wieder um das 3-fache. Und f\u00fcr doubles sehe ich sogar eine Verschlechterung um das 1.5-fache. Das m\u00fcsste man jetzt versuchen zu erkl\u00e4ren...<\/p>\n<p>Testfall3:<br \/>\nAMD FX(tm)-9590 Eight-Core Processor<br \/>\n64 bit Debian<br \/>\ng++ 4.9.2<br \/>\nARR_SIZE = 200000<br \/>\nNUM_ITER = 20000<\/p>\n<p>Mittelwert von drei Berechnungen pro Einstellung. Alle Angaben in Sekunden.<\/p>\n<table frame=box rules=all>\n<tr>\n<td><\/td>\n<td>-O3 -mfpmath=387<\/td>\n<td>-O3 -mfpmath=sse -msse2<\/td>\n<td>-O3 -mfpmath=387 -ffast-math<\/td>\n<td>-O3 -mfpmath=sse -msse2 -ffast-math<\/td>\n<\/tr>\n<tr>\n<td>float<\/td>\n<td>4.45<\/td>\n<td>4.47<\/td>\n<td>1.12<\/td>\n<td>1.17<\/td>\n<\/tr>\n<tr>\n<td>double<\/td>\n<td>4.45<\/td>\n<td>4.45<\/td>\n<td>2.35<\/td>\n<td>2.34<\/td>\n<\/tr>\n<\/table>\n<p>Die Laufzeit f\u00e4llt insgesamt, verursacht durch mehr GHz Power. Bis auf -ffast-math sind floats und doubles wieder gleich schnell. Der Geschwindigkeitsvorteil f\u00fcr fast-math liegt wieder bei \u00fcber 3.5-fach f\u00fcr floats und \u00fcber 1.5-fach f\u00fcr doubles.<\/p>\n<p>Endergebnis:<br \/>\nF\u00fcr kleine Datenmengen und IEEE Gleitkommazahlen verhalten sich floats und doubles gleich.<br \/>\nVerzichtet man auf Standard Zahlen und aktiviert fancy Optimierungen, wird man mit einem 1.5 bis 3.5-fachen schnelleren Programm belohnt, welches falsche Ergebnisse liefern kann.<br \/>\nF\u00fcr gro\u00dfe Mengen sieht die Sache anders aus. Dann wird der RAM Bus zum Flaschenhals.<\/p>\n<p>Warum verh\u00e4lt sich die Geschwindigkeit mit -ffast-math so unterschiedlich? Das muss man genauer untersuchen.<\/p>\n<p>http:\/\/www.bfilipek.com\/2012\/05\/float-vs-double.html<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wieder so ein C++ Blog, der aber in Wahrheit schei\u00df C Code verbreitet. Und dann erz\u00e4hlt er auch noch die H\u00e4lfte und macht unvollst\u00e4ndige Angaben zu seinen Tests. Es geht in dem Artikel darum, dass viele denken, dass floats kleiner und schneller als doubles sein. Kleiner sind sie, ja. Verbrauchen nur 4 Byte statt 8 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3053","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3053"}],"version-history":[{"count":22,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3053\/revisions"}],"predecessor-version":[{"id":3075,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3053\/revisions\/3075"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3053"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}