<?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[SIMD intelligent einsetzen]]></title><description><![CDATA[<p>Moin Moin.<br />
Weiß jemand wie man intelligent SIMD (SSE, 3DNow, MMX) einsetzen kann. Mein Problem ist, dass ich gern SIMD für Matrizenrechnungen nutzen möchte, aber nicht vorrausetzen will, dass der jeweilige Prozessor auch eine SIMD unterstürzung hat. Sollte das Programm auf einem Rechner mit einem älteren Prozessor laufen, soll es automatisch auf eine Alternative zurück greifen, beispielsweise dass die Rechnungen mit den C++ Operatoren durchgeführt wird.</p>
<p>Mein Problem ist, dass ich keine Idee hab, wie ich das am besten ohne großen Overhead bewerkstellige.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282420/simd-intelligent-einsetzen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 02:46:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282420.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Feb 2011 05:13:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 05:13:31 GMT]]></title><description><![CDATA[<p>Moin Moin.<br />
Weiß jemand wie man intelligent SIMD (SSE, 3DNow, MMX) einsetzen kann. Mein Problem ist, dass ich gern SIMD für Matrizenrechnungen nutzen möchte, aber nicht vorrausetzen will, dass der jeweilige Prozessor auch eine SIMD unterstürzung hat. Sollte das Programm auf einem Rechner mit einem älteren Prozessor laufen, soll es automatisch auf eine Alternative zurück greifen, beispielsweise dass die Rechnungen mit den C++ Operatoren durchgeführt wird.</p>
<p>Mein Problem ist, dass ich keine Idee hab, wie ich das am besten ohne großen Overhead bewerkstellige.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023508</guid><dc:creator><![CDATA[Mr. Potato]]></dc:creator><pubDate>Sun, 20 Feb 2011 05:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 07:20:12 GMT]]></title><description><![CDATA[<p>Am Einfachste ist, dich darüber zu informieren, wie die Compiler SIMD-fähigen Code erkennen wenn du die entsprechenden Flags einstellst. Dann schreibste deinen Code einfach so, dass die Compiler das packen und hoffst, dass das funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023519</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023519</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 20 Feb 2011 07:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 09:07:10 GMT]]></title><description><![CDATA[<p>Ne was ich meine ist die Auswahl, was benutzt wird. Die einfachste Variante wäre ja wenn ich den Präprozessor nutze:</p>
<pre><code class="language-cpp">matrix matrix_mul(matrix a, matrix b) {
#ifdef USE_SSE
	// SSE Code hier ...
#else
	// C++ Code hier ...
#endif
}
</code></pre>
<p>Doch dann hab ich das Problem, dass ich vor der compilierung entscheiden muss, ob das ganze nun nur auf Prozessoren mit SSE unterstüzung laufen kann, oder halt ohne auf viele Prozessoren. Dann könnte ich ja noch sagen, dass ich in jeder Funktion mit einer if-Bedingung prüfe, ob SSE funzt:</p>
<pre><code class="language-cpp">matrix matrix_mul(matrix a, matrix b) {
	if(g_is_sse_supported) {
		// SSE Code hier ...
	} else {
		// C++ Code hier ...
	}
}
</code></pre>
<p>Das find ich jedoch noch schlimmer, wegen dem Overhead den ich in lauf nehmen muss. Mir wäre ne Methode am liebsten, wo einmal beim Programmstart geprüft wird, ob SSE auf dem System funzt und die Funktionen bzw Methoden dann jeweils genutzt werden, ohne dass ich weiter Overhead inkauf nehmen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023547</guid><dc:creator><![CDATA[Mr. Potato]]></dc:creator><pubDate>Sun, 20 Feb 2011 09:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 09:10:06 GMT]]></title><description><![CDATA[<p>Pack das Zeug in X dll's und dann lade die zu dem system kompatible... oder arbeite intern direkt mit Funktionszeigern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023552</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 20 Feb 2011 09:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 09:18:58 GMT]]></title><description><![CDATA[<blockquote>
<p>Pack das Zeug in X dll's und dann lade die zu dem system kompatible... oder arbeite intern direkt mit Funktionszeigern.</p>
</blockquote>
<p>Ich würd das nur ungern über DLLs lösen, da mir so der inline vorteil verloren geht, und meist bringt ein einfaches inline mehr als die SIMD optimierung, denk ich mal ...</p>
<p>Das mit den Funktionszeigern klingt interessant, nur blöd das ich noch nie wirklich damit gearbeitet hab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ich produziere seit Jahren schlechten C++ Code, mit C hatte ich noch nix am Hut.</p>
<p>Hab ich durch die Funktionszeiger kein Overhead? Funktioniert dann auch noch inline so wie es soll?</p>
<p>Edit:<br />
Ehm, iwie kann man inline ja garnet bewerkstelligen, wenn man eine codeauswahl zur laufzeit hat, oder täusche ich mich grad?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023554</guid><dc:creator><![CDATA[Mr. Potato]]></dc:creator><pubDate>Sun, 20 Feb 2011 09:18:58 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 09:24:06 GMT]]></title><description><![CDATA[<p>Bingo! (Außer natürlich durch sich selbst verändernden code...)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023557</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 20 Feb 2011 09:24:06 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Sun, 20 Feb 2011 09:38:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Außer natürlich durch sich selbst verändernden code...</p>
</blockquote>
<p>Das müsstest du mir mal genauer erklären!?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023562</guid><dc:creator><![CDATA[Mr. Potato]]></dc:creator><pubDate>Sun, 20 Feb 2011 09:38:01 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 14:31:37 GMT]]></title><description><![CDATA[<p>Mr. Potato schrieb:</p>
<blockquote>
<blockquote>
<p>Außer natürlich durch sich selbst verändernden code...</p>
</blockquote>
<p>Das müsstest du mir mal genauer erklären!?^^</p>
</blockquote>
<p>Lass lieber die Finger davon und benutz´ Funktionspointer. Wenn man typedefs benutzt sieht das alles nicht mehr so wild aus.</p>
<p>Header</p>
<pre><code class="language-cpp">// Typdefinition für Funktionspointer
typedef double (*fun_double_2_param)( double, double );

// Addition, einmal Standard FPU, einmal SSE
double fpu_add( double op1, double op2 ) { return op1 + op2; }
double sse_add( double op1, double op2 ) { return op1 + op2; }

struct DoubleOp
{
   // Funktionszeiger auf zu benutzende Funktion
   static fun_double_2_param add;

   static void initialize();
}
</code></pre>
<p>Implementation</p>
<pre><code class="language-cpp">// Funktionszeiger mit 0 initialisieren
fun_double_2_param DoubleOp::add = 0;

void DoubleOp::initialize()
{
   // Funktionspointer in Abhängigkeit der SSE Verfügbarkeit setzen
   if( !sse_enabled() )
   {
      // kein SSE, normale FPU benutzen
      add = fpu_add;
   }
   else
   {
      // SSE verfügbar und benutzen
      add = sse_add;
   }
}

int main(int argc, char* argv[])
{
   DoubleOp::initialize();
   double e = DoubleOp::add( 2,3 );
}
</code></pre>
<p>Wenn man das sicher machen möchte kann man das <code>struct</code> durch <code>class</code> ersetzen, die eigentlich Funktionszeiger privat machen und den Aufruf durch eine Wrapper Methode erledigen, die die Gültigkeit des Funktionszeigers prüft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024195</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 21 Feb 2011 14:31:37 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 14:53:22 GMT]]></title><description><![CDATA[<p>Der OP wollte ja, dass der Code dynamisch plattformabhängig ge&quot;inline&quot;d wird, wo sinnvoll... Ist natürlich schwer zu bewerkstelligen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2024215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024215</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Feb 2011 14:53:22 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 15:13:48 GMT]]></title><description><![CDATA[<p>Decimad schrieb:</p>
<blockquote>
<p>Der OP wollte ja, dass der Code dynamisch plattformabhängig ge&quot;inline&quot;d wird, wo sinnvoll... Ist natürlich schwer zu bewerkstelligen <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>
</blockquote>
<p>Schwer zu bewerkstelligen und nicht zu garantieren. Was und wie ein Compiler inlinen kann, weiß nur der Compiler (und evtl. noch seine Hersteller). Ein &quot;inline&quot; im Code heißt überhauptnichts. Es ist nur ein Hinweis an den Compiler, dass er die Funktion vielleicht wenns ihm nicht zu viel ausmacht und er grade nichts besseres vorhat inlinen <em>könnte</em>. Ob er kann/will/darf prüft ein aktueller Compiler aber sowieso bei so jeder Funktion, daher hat ein explizites &quot;inline&quot; im Code nichts zu sagen.<br />
Was das Inlinen über DLL-Grenzen hinweg angeht - manche Runtimes können auch das. Mein Tip wäre, es so zu implementieren wie es gut umsetzbar ist, ohne den Code zu einem Alptraum zu machen, und dann in einem Stresstest den Profiler zu bemühen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024238</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Feb 2011 15:13:48 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 16:17:22 GMT]]></title><description><![CDATA[<p>Wie soll der Compiler denn plattformabhängig inline Code erzeugen, wenn erst zur Laufzeit feststeht, ob SSE verfügbar ist oder nicht?<br />
Ein erster Ansatz zur Performancesteigerung ist z.B. die Matrizen als Referenz und nicht als Kopie zu übergeben. Vielleicht wird ja noch anderswo CPU Zeit verbrannt, was man durch einfachere Maßnahmen in den Griff kriegen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024276</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 21 Feb 2011 16:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 16:29:49 GMT]]></title><description><![CDATA[<p>Btw: <em>Praktisch jede</em> CPU in einem PC unterstützt heutzutage schon mindestens SSE2 <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>Um vielleicht ein paar Zahlen zu nennen: Über 97% der Computer in der <a href="http://store.steampowered.com/hwsurvey" rel="nofollow">Steam Hardware Survey</a> haben sogar SSE3...Natürlich muss das nicht unbedingt deine Zielgruppe widerspiegeln, im Zweifelsfall würde ich auf bedingte Kompilierung setzen, das ist wohl das Einzige was mit Sicherheit optimale Performance liefert. Und wenn du mit MSVC arbeitest dann auch wichtig: Kein inline asm sondern <a href="http://msdn.microsoft.com/en-us/library/y0dh78ez.aspx" rel="nofollow">Intrinsics</a> verwenden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024280</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 21 Feb 2011 16:29:49 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 17:56:51 GMT]]></title><description><![CDATA[<p>Eine guter Kompromiss wäre auch, anstatt die direkten mathematischen Operationen per Funktionszeiger auf die richtige Implementierung zu biegen, die zeitraubendsten Algorithmen komplett zu übersetzen, so wird der Aufruf&quot;overhead&quot; verringert, wenns auf den letzten Zyklus ankommt. Andererseits könnte man auch gleich mehrere Executables mitliefern... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2024338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024338</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Feb 2011 17:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to SIMD intelligent einsetzen on Mon, 21 Feb 2011 18:17:53 GMT]]></title><description><![CDATA[<p>Stimmt. Das meiste aus SSE bekommt man in der Regel wenn man seine ganzen Datenstrukturen etc. so auslegt dass man möglichst lange Datenströme damit bearbeitet. Einzelne Vektoroperationen über SSE abzuwickeln bringt zwar auch einen gewissen Performancevorteil aber mehr zu gewinnen gibts sicherlich wenn man ganze Algorithmen ensprechend für SSE implementiert. Simples Beispiel: Vektorarithmetik ist in der Regel durchsetzt mit horizontalen Operationen (Skalarprodukten). Eine reguläre SSE Implementierung erfordert da shuffling. Es ist viel effizienter wenn man Algorithmus und Datenstruktur so auslegt dass man nicht ein Skalarprodukt berechnet (dabei gewinnt man praktisch nur dass die Multiplikation der Vektorkomponenten parallelisiert wird) sondern besser 4 Skalarprodukte parallel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024343</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Mon, 21 Feb 2011 18:17:53 GMT</pubDate></item></channel></rss>