<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Inline-Assembler]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich hab mich in letzter Zeit ein wenig mit Inline-Assembler unter C/C++ beschäftigt und soweit sieht das auch recht simpel aus, sofern man etwas Ahnung von Assembler hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Ich verstehe aber noch nicht so ganz unter welchen Umständen man nun damit wirklich Code optimieren kann..</p>
<p>Wenn man jetzt z.B. einen Bubblesort-Algorithmus mit Inline-Assembler realisiert,<br />
läuft dieser dann grundsätzlich schneller/speichereffizienter als ein in C++<br />
geschriebener?<br />
Oder ist das wie so oft abhängig Compiler oder so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285911/inline-assembler</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 00:51:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285911.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Apr 2011 16:36:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 16:36:32 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich hab mich in letzter Zeit ein wenig mit Inline-Assembler unter C/C++ beschäftigt und soweit sieht das auch recht simpel aus, sofern man etwas Ahnung von Assembler hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Ich verstehe aber noch nicht so ganz unter welchen Umständen man nun damit wirklich Code optimieren kann..</p>
<p>Wenn man jetzt z.B. einen Bubblesort-Algorithmus mit Inline-Assembler realisiert,<br />
läuft dieser dann grundsätzlich schneller/speichereffizienter als ein in C++<br />
geschriebener?<br />
Oder ist das wie so oft abhängig Compiler oder so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056152</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Fri, 29 Apr 2011 16:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 16:40:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn man jetzt z.B. einen Bubblesort-Algorithmus mit Inline-Assembler realisiert,<br />
läuft dieser dann grundsätzlich schneller/speichereffizienter als ein in C++<br />
geschriebener?</p>
</blockquote>
<p>Erklär mir mal warum sowas Grundsätzlich schneller/effizienter sein sollte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056155</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 29 Apr 2011 16:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 16:50:49 GMT]]></title><description><![CDATA[<p>Genau das will ich ja wissen..<br />
Was genau und unter welchen Umständen kann man damit optimieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056159</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Fri, 29 Apr 2011 16:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:01:13 GMT]]></title><description><![CDATA[<p>Du kannst das vermutlich nur optimieren, wenn du in deinem inline-Assembler spezielle Befehle verwendest oder spezielle Verläufe optimierst. Grundsätzlich wirst du aber bei Bubblesort keinen Geschwindigkeitsvorteil erwarten können, zumal inline-Assembler nicht standardisiert ist und beim GCC anders aussieht als beim MSVC.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056166</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:03:21 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<p>Was genau und unter welchen Umständen kann man damit optimieren?</p>
</blockquote>
<p>Wenn du schlauer bist als der Compiler, also zum Beispiel irgendwelche Garantien hast, die du dem Compiler nicht kar machen kannst, aber den Assemlercode optimieren würden.</p>
<p>Lohnen tut sich das alles aber nur bei ganz speziellen Stellen, die im Vergleich zum restlichen Programm sehr sehr oft durchlaufen werden. Also eigentlich nie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056169</guid><dc:creator><![CDATA[jaegerundassembler]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:11:27 GMT]]></title><description><![CDATA[<p>Ein extrem begabter Programmierer kann eventuell einen Algorithmus in Assembler schreiben, der schneller sein kann, als in einer Hochsprache. Dies kann vorkommen, wenn man die Konstrukte der Hochsprache die einen Overhead haben nicht benötigt. In C fällt es mir schwer, dafür ein Beispiel zu finden, da C schon sehr low-level ist.<br />
Es ist auch möglich, gewisse Optimierungen vorzunehmen, weil man eventuell Zusatzinformationen, z.B. über mögliches Pointeraliasing, nutzen kann, die der Compiler nicht zur Verfügung hat.<br />
Und zu guter letzt kann man eventuell maschinenspezifische Befehle und Besonderheiten nutzen, die noch nicht in den Compiler eingebaut wurden.</p>
<p>Aber das alles können nur sehr erfahrene Programmierer besser als ein Compiler und der Einsatz von Inlineassembler zur Optimierung ist eine aussterbende Kunst.</p>
<p>(Dir ist hoffentlich bewusst, dass dies nicht der einzige Einsatzzweck von Inlineassembler ist. Inlineassembler an sich ist schon noch äußerst wichtig)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056178</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:11:27 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:16:18 GMT]]></title><description><![CDATA[<p>Also kann man sagen, dass es sich nur bei Compilern lohnt, die nicht selbst<br />
&quot;gut&quot; optimieren, weil zu alt oder so oder wenn man ein Codesegment hat, welches<br />
sehr oft wiederholt wird..:</p>
<pre><code class="language-cpp">inline void swap(unsigned int&amp; a, unsigned int&amp; b)
{
  _asm
  {
    mov ax, a
    xchg ax, b
    mov a, ax
  }
}

/* Bubblesort
 *
 */
swap(a, b);
/*
 *
 */
</code></pre>
<p>Würde so etwas dann Sinn machen oder würde ein moderner Compiler selbst so etwas<br />
weg optimieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056183</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:20:33 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>(Dir ist hoffentlich bewusst, dass dies nicht der einzige Einsatzzweck von Inlineassembler ist. Inlineassembler an sich ist schon noch äußerst wichtig)</p>
</blockquote>
<p>Was denn z.B.?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056185</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:20:33 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:28:29 GMT]]></title><description><![CDATA[<p>Ich benutze Inline Assembler eigentlich nur um z.B. einen KeyGen zu programmieren.<br />
Die Algorithmen des Originalprogramms muss ich dann nur kopieren und kleinere Änderungen vornehmen. Dann muss ich nicht alles neu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056188</guid><dc:creator><![CDATA[Frezee]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:28:29 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 17:33:26 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<p>Würde so etwas dann Sinn machen oder würde ein moderner Compiler selbst so etwas<br />
weg optimieren?</p>
</blockquote>
<p>Das würde dein Compiler(und zwar jeder) mindestens genau so gut oder besser machen. Du musst schon etwas einigermaßen komplexes Handoptimieren, wo die Maschine eventuell irgendwelche Zusammenhänge nicht sehen kann, die einem menschlichen Programmierer bekannt sind.</p>
<blockquote>
<p>Was denn z.B.?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Na, für alles was die Sprache nicht hergibt. Was dachtest du denn, wie die ganzen Betriebssystemaufrufe funktionieren oder wie man spezielle Hardware ansteuert? Ohne Assembler wäre C++ nur dazu gut, einen abstrahierten schwarzen Kasten mit einer Ein-/Ausgabe über einen (abstrahierten) Lochstreifen zu programmieren. Mit Assemblerbibliotheken ist es eine Weltsprache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056191</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 29 Apr 2011 17:33:26 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 18:29:32 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<pre><code class="language-cpp">inline void swap(unsigned int&amp; a, unsigned int&amp; b)
{
  _asm
  {
    mov ax, a
    xchg ax, b
    mov a, ax
  }
}
</code></pre>
<p>Würde so etwas dann Sinn machen oder würde ein moderner Compiler selbst so etwas<br />
weg optimieren?</p>
</blockquote>
<p>Was meinst du mit wegoptimieren... Übrigens, xchg-Befehl ist toll, aber mit Speicheroperanden langsam (ich habe das mal &quot;gemessen&quot;: <a href="http://www.c-plusplus.net/forum/238127" rel="nofollow">http://www.c-plusplus.net/forum/238127</a>). Dann versuchst du wahrscheinlich 32 Bit Variablen in 16 Bit Register zu laden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056228</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Fri, 29 Apr 2011 18:29:32 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Fri, 29 Apr 2011 19:08:28 GMT]]></title><description><![CDATA[<p>Lies dich mal hier durch: <a href="http://www.agner.org/optimize/" rel="nofollow">http://www.agner.org/optimize/</a></p>
<p>Als Beispiel könntest du dir die optimierten Versionen von memcpy etc ansehen, die mit den 128bit-Registern kopieren usw.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056247</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 29 Apr 2011 19:08:28 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sat, 30 Apr 2011 16:44:05 GMT]]></title><description><![CDATA[<p>@ Ethon:<br />
So was hatte ich gesucht..<br />
Danke</p>
<p>@ abc.w<br />
Also wäre es bei xchg sinnvoll beide Variablen ins Register zu laden und dann<br />
erst zu tauschen?<br />
Und seit wann ist unsigned int == 32bit? Oder was meinst du damit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056530</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Sat, 30 Apr 2011 16:44:05 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sun, 01 May 2011 11:56:01 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<p>Also wäre es bei xchg sinnvoll beide Variablen ins Register zu laden und dann erst zu tauschen?</p>
</blockquote>
<p>Ob sinvoll ist - weiß ich nicht. Man könnte auch einfach so was machen:</p>
<pre><code class="language-asm">mov ax, a
mov bx, b
mov b, ax
mov a, bx
</code></pre>
<p>Am Besten selber messen und vergleichen. Lesen, was andere dazu meinen oder welche Erfahrungen sie damit gemacht haben, bei sich ausprobieren und wieder vergleichen. Das sinnvollste ist auf jeden Fall, mehrere Möglichkeiten implementieren, messen und vergleichen. Dann lässt sich aussagen, ob etwas schneller ist oder nicht.</p>
<p>NEO.PIXEL schrieb:</p>
<blockquote>
<p>Und seit wann ist unsigned int == 32bit? Oder was meinst du damit?</p>
</blockquote>
<p>Ach so, meinst du sizeof(unsigned int) ist bei deinem Compiler 2 Bytes? Habe ich noch nie gesehen... ich würde sagen, benutze am Besten uint16_t oder füge in deinem Code so was wie:</p>
<pre><code class="language-cpp">typedef char check_for_unsigned_int[(sizeof(unsigned int) == 2) ? 1 : -1];
</code></pre>
<p>damit der Code nicht baut und man auf diesen Umstand gleich aufmerksam wird, wenn jemand den Code portieren soll... aber andererseits verwendest du Inline-Assembler und damit ist dein Code bereits auf deinen Compiler festgenagelt, also nicht mehr portabel und so gesehen, macht es keinen Sinn, irgendwelche Checks einzubauen oder sich über Datentypen Gedanken zu machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056763</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Sun, 01 May 2011 11:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sun, 01 May 2011 15:56:50 GMT]]></title><description><![CDATA[<p>Ok unsigned int ist tatsächlich 4 Byte groß.. Mein Fehler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Hab dann jetzt einfach mal versucht mit den mir bekannten Mitteln selbst nachzumessen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ctime&gt;

inline void swap_cpp(int&amp; a, int&amp; b)
{
  int temp = a;
  a = b;
  b = temp;
}

inline void swap_mov(int&amp; a, int&amp; b)
{
  asm volatile(&quot;mov ecx, eax\n\t&quot;
	       &quot;mov eax, ebx\n\t&quot;
	       &quot;mov ebx, ecx&quot;
	       :&quot;=a&quot;(a), &quot;=b&quot;(b)
	       :&quot;a&quot;(a), &quot;b&quot;(b));
}

inline void swap_xchg(int&amp; a, int&amp; b)
{
  asm volatile(&quot;xchg eax, ebx&quot; : &quot;=a&quot;(a), &quot;=b&quot;(b) : &quot;a&quot;(a), &quot;b&quot;(b));
}

inline void show(const char* c, clock_t&amp; s, clock_t&amp; e)
{
  std::cout&lt;&lt;c
	   &lt;&lt;&quot;:\t\t&quot;
	   &lt;&lt;(e-s)/(0.001*CLOCKS_PER_SEC)
	   &lt;&lt;&quot; ms&quot;
	   &lt;&lt;std::endl;
}

int main(void)
{
  int a = 789, b = -987;
  clock_t start, end;
  const unsigned L = 1e8;

  start = clock();
  for(unsigned i = 0; i &lt; L; i++)	swap_cpp(a, b);
  end = clock();
  show(&quot;swap_cpp&quot;, start, end);

  start = clock();
  for(unsigned i = 0; i &lt; L; i++)	swap_mov(a, b);
  end = clock();
  show(&quot;swap_mov&quot;, start, end);

  start = clock();
  for(unsigned i = 0; i &lt; L; i++)	swap_xchg(a, b);
  end = clock();
  show(&quot;swap_xchg&quot;, start, end);

  return 0;
}
</code></pre>
<p>Ergebnis:</p>
<p>swap_cpp: 2210 ms<br />
swap_mov: 2520 ms<br />
swap_xchg: 2490 ms</p>
<p>Womit der Compiler (gcc version 4.5.2, Ubuntu) klar gewonnen hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Aber xchg scheint, sofern beide Variablen im Register, schneller zu sein als mov..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056834</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056834</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Sun, 01 May 2011 15:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sun, 01 May 2011 16:13:05 GMT]]></title><description><![CDATA[<p>Der Compiler ist eigentlich sehr oft besser als der Otto-Normal-Programmierer</p>
<pre><code class="language-cpp">void swap(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a = 42;
	int b = 23;
	swap(a,b);
	std::cout &lt;&lt; a &lt;&lt; b &lt;&lt; std::endl;
	return 0;
}
</code></pre>
<p>Bei diesem Code wird das swap z.B. einfach wegoptimiert und der Compiler macht aus<br />
<code>std::cout &lt;&lt; a &lt;&lt; b &lt;&lt; std::endl;</code><br />
einfach<br />
<code>std::cout &lt;&lt; b &lt;&lt; a &lt;&lt; std::endl;</code><br />
Und das schaffste mit Inline-Assembler in dieser Form (mit meinen Kentnissen) nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056837</guid><dc:creator><![CDATA[Pikkolini]]></dc:creator><pubDate>Sun, 01 May 2011 16:13:05 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sun, 01 May 2011 16:50:31 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<p>Ergebnis: ...<br />
Womit der Compiler (gcc version 4.5.2, Ubuntu) klar gewonnen hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Aber xchg scheint, sofern beide Variablen im Register, schneller zu sein als mov..</p>
</blockquote>
<p>Ich würde jetzt noch mit ein Paar Compiler-Optionen rumspielen: -Os, -O2, -O3. Dann noch immer schön -g0 verwenden. Dann immer Warnungen einschalten: -Wall -Wextra -Werror -pedantic...</p>
<pre><code>g++ main.cpp -o main -Os -g0 -Wall -Wextra -Werror -pedantic
g++ main.cpp -o main -O2 -g0 -Wall -Wextra -Werror -pedantic
g++ main.cpp -o main -O3 -g0 -Wall -Wextra -Werror -pedantic
</code></pre>
<p>Pikkolini schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void swap(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}
</code></pre>
<p>...</p>
</blockquote>
<p>Ih glaube, du hast dich vertippt... Diese swap-Funktion wird natürlich wegoptimiert, weil sie nichts zurückgibt und im Prinzip nichts wirklich verändert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056850</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Sun, 01 May 2011 16:50:31 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sun, 01 May 2011 18:00:39 GMT]]></title><description><![CDATA[<p>Hab mal mit den Compileroptionen rumgespielt..</p>
<p>Ergebnis nach Weiteroptimieren mit -Os, -O2, -O3:</p>
<p>swap_cpp: 250 ms<br />
swap_mov: 270 ms<br />
swap_xchg: 690 ms</p>
<p>Jetzt ist xchg tatsächlich mit Abstand am langsamsten..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056866</guid><dc:creator><![CDATA[NEO.PIXEL]]></dc:creator><pubDate>Sun, 01 May 2011 18:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Sun, 01 May 2011 23:27:23 GMT]]></title><description><![CDATA[<p>Optimierungen dieser Art sind... keine.<br />
Die einzig brauchbare Form von Assembler-swap sieht so aus (ist zudem sehr portabel):</p>
<pre><code class="language-cpp">void swap(int&amp; a, int&amp; b)
{
    asm( &quot;&quot; : &quot;=x&quot; (a), &quot;=x&quot; (b) : &quot;1&quot; (a), &quot;0&quot; (b));
}
</code></pre>
<p>Besser als normaler Dreickstausch ist das allerdings ebenso nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056943</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 01 May 2011 23:27:23 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Mon, 02 May 2011 00:25:44 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<pre><code class="language-cpp">inline void swap_mov(int&amp; a, int&amp; b)
{
  asm volatile(&quot;mov ecx, eax\n\t&quot;
	       &quot;mov eax, ebx\n\t&quot;
	       &quot;mov ebx, ecx&quot;
	       :&quot;=a&quot;(a), &quot;=b&quot;(b)
	       :&quot;a&quot;(a), &quot;b&quot;(b));
}
</code></pre>
</blockquote>
<p>Das kettet die drei movs leider direkt aneinander und der Compiler traut sich nicht, über Deinen Code nachzudenken, und ihn mit seinem zu vermischen und vielleicht was dazuwischenzumachen, was gerade vom Pipeline-Füllen oder Sprungzielausrichten oder so ihm gerade am besten passen würde, oder vielleicht braucht er eax und ebx für was besseres und hätte esi und edi gerade frei?</p>
<p>Generell versuche ich, dem Compiler maximale Freiheit zu lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056944</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 02 May 2011 00:25:44 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Mon, 02 May 2011 04:20:49 GMT]]></title><description><![CDATA[<p>Ich hab da mal eine Frage an die Experten hier. Ist es tatsächlich so dass der Compiler besser optimiert auch wenn man per Hand mit SSE etc arbeitet?</p>
<p>Ich beschäftige mich mit Grafikprogrammierung und daher auch ein wenig mit der Mathematik dahinter. Wenn ich da irgendwelche Matrizenoperationen oder z.B. nen schnellen Sinus per Polynom oder Taylorreihe annähere, dann lese ich oft auch was über SSE-Optimierungen in Assembler.</p>
<p>Ich habe seit dem C64 und Amiga nix mehr mit Assembler gemacht, aber ich meine gelesen zu haben dass man mit SSE so Rechnungen wie Addition und Multiplikation in einem Rutsch machen kann?</p>
<p>Gruß Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056957</guid><dc:creator><![CDATA[cfoobar]]></dc:creator><pubDate>Mon, 02 May 2011 04:20:49 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Mon, 02 May 2011 06:11:06 GMT]]></title><description><![CDATA[<p>Mich wundert diese Assembler Interesse etwas - der Compiler macht doch auch nichts anderes als Assembler. Der wird wohl kaum Additionen und so in fünf Schritten machen ... Ich stand bisher auf dem Standpunkt das Assembler nur nützt wenn man Insiderwissen hat oder wirklich auf 99.8% statt 99.437% Performance aus ist? Und wenn man nicht misst oder deassembliert landet man schnell bei 99.02% weil man was weniger schlau macht als der Compiler? _Gerade_ für Grafikzeug, wäre es da nicht vorteilhafter wenn man immer wiederkehrende Rechnungn auf der GPU ausführt statt die CPU mit eigenem Assembler besser auslasten zu wollen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2056979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2056979</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Mon, 02 May 2011 06:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Mon, 02 May 2011 08:31:22 GMT]]></title><description><![CDATA[<p>NEO.PIXEL schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>(Dir ist hoffentlich bewusst, dass dies nicht der einzige Einsatzzweck von Inlineassembler ist. Inlineassembler an sich ist schon noch äußerst wichtig)</p>
</blockquote>
<p>Was denn z.B.?</p>
</blockquote>
<p>Ich arbeite in einer Anwendung mit Fixed-Point-Arithmetik, und muss dort häufig Float-Werte in Fixed-Werte überführen (runden, nicht abschneiden). Das geht unter POSIX-Systemen wunderbar mit <code>lrint</code> . Unter Windows gibt es leider kein <code>lrint</code> . +0.5 und dann casten ist grausam langsam (die Funktion wird im Code extrem häufig ausgeführt). Daher benutze ich unter Windows folgendes kleines <code>asm</code> dafür:</p>
<pre><code class="language-cpp">inline long round(float val)
{
    long result;
    _asm
    {
        fld val
        fistp result
    }
    return result;
}
</code></pre>
<p>Das hat ca. 350% Zuwachs (auf einem Pentium M) an Leistung gebracht.</p>
<p><em>Edit: Wobei ich gerade sehe, dass dies bei MSVC 2008 wohl auch überflüssig ist. Da wird <code>__ftol2_sse</code> für die Konvertierung mittels Cast benutzt.</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057036</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 02 May 2011 08:31:22 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Mon, 02 May 2011 20:14:09 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Die einzig brauchbare Form von Assembler-swap sieht so aus (ist zudem sehr portabel):</p>
<pre><code class="language-cpp">void swap(int&amp; a, int&amp; b)
{
    asm( &quot;&quot; : &quot;=x&quot; (a), &quot;=x&quot; (b) : &quot;1&quot; (a), &quot;0&quot; (b));
}
</code></pre>
</blockquote>
<p>Portabel <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code># g++ -c tmp.c
tmp.c: In function `void swap(int&amp;, int&amp;)':
tmp.c:3: error: impossible constraint in `asm'
</code></pre>
<p>Toll <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057458</guid><dc:creator><![CDATA[abc.w]]></dc:creator><pubDate>Mon, 02 May 2011 20:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Mon, 02 May 2011 23:24:26 GMT]]></title><description><![CDATA[<p>abc.w schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Die einzig brauchbare Form von Assembler-swap sieht so aus (ist zudem sehr portabel):</p>
<pre><code class="language-cpp">void swap(int&amp; a, int&amp; b)
{
    asm( &quot;&quot; : &quot;=x&quot; (a), &quot;=x&quot; (b) : &quot;1&quot; (a), &quot;0&quot; (b));
}
</code></pre>
</blockquote>
<p>Portabel <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Jedenfalls funktioniert es ohne Anpassung auf jeder Plattform, die von gcc unterstützt wird, da ja die Anweisung selbst keine Code emittiert.</p>
<p>abc.w schrieb:</p>
<blockquote>
<pre><code># g++ -c tmp.c
tmp.c: In function `void swap(int&amp;, int&amp;)':
tmp.c:3: error: impossible constraint in `asm'
</code></pre>
<p>Toll <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Falscher Code oder falscher Compiler. gcc-4.5.2 schluckt es und macht auch das Richtige damit. Die Fehlermeldung ist jedenfalls verdächtig unwahrscheinlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057531</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 02 May 2011 23:24:26 GMT</pubDate></item><item><title><![CDATA[Reply to Inline-Assembler on Tue, 03 May 2011 04:16:07 GMT]]></title><description><![CDATA[<p>padreigh schrieb:</p>
<blockquote>
<p>Mich wundert diese Assembler Interesse etwas - der Compiler macht doch auch nichts anderes als Assembler. Der wird wohl kaum Additionen und so in fünf Schritten machen ... Ich stand bisher auf dem Standpunkt das Assembler nur nützt wenn man Insiderwissen hat oder wirklich auf 99.8% statt 99.437% Performance aus ist? Und wenn man nicht misst oder deassembliert landet man schnell bei 99.02% weil man was weniger schlau macht als der Compiler? _Gerade_ für Grafikzeug, wäre es da nicht vorteilhafter wenn man immer wiederkehrende Rechnungn auf der GPU ausführt statt die CPU mit eigenem Assembler besser auslasten zu wollen?</p>
</blockquote>
<p>Das Assemblerinteresse ist halt noch von früher da, dort habe ich so kleine Grafikdemos programmiert und da ging ohne Assembler gar nix. Das war aber auch nicht sonderlich schlimm, man hatte nur mehr Tipparbeit, aber von der Sprache her habe ich die Grundlagen nie wieder zu schnell lernen können, wie die von Assembler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ne mir ist schon klar, dass man heute das kaum noch braucht, und die Compiler da bestimmt viel besser optimieren wie ich. Bei meinen Recherchen nach Algorithmen und deren Implementierung, bin ich halt immer wieder auf Funktionen mit Inline-Assembler gestoßen, also denke ich mir dass sich da doch noch eine Menge optimieren läßt. Ich glaube bei denen ging es auch nicht um ein paar Prozent, sondern gleich um 30% oder noch mehr.</p>
<p>Da ich einen Software-Renderer unter Windows schreiben will, brauche ich keine programmierbare GPU oder ein GUI-Framework das portabel ist. Da reicht C und WinAPI völlig aus, es dient eh nur meiner eigenen Neugier.</p>
<p>Gruß Chris</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2057550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2057550</guid><dc:creator><![CDATA[cfoobar]]></dc:creator><pubDate>Tue, 03 May 2011 04:16:07 GMT</pubDate></item></channel></rss>