{"id":3494,"date":"2018-05-18T19:38:02","date_gmt":"2018-05-18T18:38:02","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3494"},"modified":"2018-05-18T19:38:02","modified_gmt":"2018-05-18T18:38:02","slug":"c-guns-choose-the-right-datatype","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3494","title":{"rendered":"C++ Guns: Choose the right datatype"},"content":{"rendered":"<p>Hier ein sehr kleiner Ausschnitt aus der Praxis und der Assembercode. Verwendet wird ein Vector basierend auf SSEvalarray. <\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nauto func(const SSEVector&lt;float,3&gt;&amp; UBAR) {\r\n    const auto U = UBAR&#x5B;1]\/UBAR&#x5B;0];\r\n    const auto V = UBAR&#x5B;2]\/UBAR&#x5B;0];\r\n    \/\/ more code which use U and V\r\n    return U*V;\r\n}\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfunc(Vector&lt;float, 3&gt; const&amp;):\r\n  movss (%rdi), %xmm2\r\n  movss 4(%rdi), %xmm0\r\n  divss %xmm2, %xmm0\r\n  movss 8(%rdi), %xmm1\r\n  divss %xmm2, %xmm1\r\n  mulss %xmm1, %xmm0\r\n<\/pre>\n<p>Wir sehen ein paar MOVs und insbesondere zwei DIVs. Die Eingabevariable ist aber ein SSE Type. Warum sind dann auch zwei DIVs im Assember Code zu sehen? Na weil zwei Divisionen im C++ Code stehen. Um das zu verbessern muss man davon absehen zusammengeh\u00f6rige Dinge als einzelne Skalare zu implementieren.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nauto func(const Vector&lt;float,3&gt;&amp; UBAR) {\r\n  Vector&lt;float,3&gt; UV = UBAR\/UBAR&#x5B;0]; \r\n  return UV;\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfunc(Vector&lt;float, 3&gt; const&amp;):\r\n  movss (%rdi), %xmm1\r\n  shufps $0, %xmm1, %xmm1\r\n  movaps (%rdi), %xmm0\r\n  divps %xmm1, %xmm0\r\n<\/pre>\n<p>Diesmal existiert nur eine DIV Instruktion f\u00fcr gepackte Werte. Die Shuffle Instruktion verteil den Skalar in UBAR[0] auf alle 32Bit Einheiten im SSE Register. Allerdings ist der Code etwas verwirrend. Die Variable UV ist ein Vector mit drei Elementen. Aber es werden nur zwei Benutzt. Die Semantik ist etwas kaputt.<br \/>\nDer Vektor UBAR stellt soll eigentlich zwei Variablen darstellen. Geschwindigkeit und Durchfluss. Wenn das Programm entsprechend modelliert wird...<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstruct U_t {    \r\n  Vector&lt;double,2&gt; q;\r\n  double H;\r\n};\r\n\r\nauto func(const U_t&amp; UBAR) {\r\n  Vector&lt;double,2&gt; v = UBAR.q\/UBAR.H; \r\n  return v;\r\n}\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nfunc(U_t const&amp;):\r\n  movsd 16(%rdi), %xmm1\r\n  unpcklpd %xmm1, %xmm1\r\n  movapd (%rdi), %xmm0\r\n  divpd %xmm1, %xmm0\r\n<\/pre>\n<p>Der Assemblercode bleibt im Prinzip gleich, nur dass jetzt ohne Verlust double statt float genutzt werden kann. Und die Semantik ist wieder hergestellt :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hier ein sehr kleiner Ausschnitt aus der Praxis und der Assembercode. Verwendet wird ein Vector basierend auf SSEvalarray. auto func(const SSEVector&lt;float,3&gt;&amp; UBAR) { const auto U = UBAR&#x5B;1]\/UBAR&#x5B;0]; const auto V = UBAR&#x5B;2]\/UBAR&#x5B;0]; \/\/ more code which use U and V return U*V; } func(Vector&lt;float, 3&gt; const&amp;): movss (%rdi), %xmm2 movss 4(%rdi), %xmm0 divss %xmm2, [&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-3494","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\/3494","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=3494"}],"version-history":[{"count":5,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3494\/revisions"}],"predecessor-version":[{"id":3499,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3494\/revisions\/3499"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3494"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3494"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3494"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}