<?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[thread local: Zu erwartende performance?]]></title><description><![CDATA[<p>Hintergrunt:<br />
Momentan entwickel ich einen OpenGL Wrapper. Ein GL Kontext ist immer an genau einen Thread gekoppelt und hat in meinem Wrapper ein eigenes State Objekt.<br />
Man muss immer zwei pointer benutzen um eine Methode der Wrapper Objekte aufzurufen. Einmal das Objekt und zweitens das GL Kontext Objekt.</p>
<p>Methoden kann man also folgendermaßen designen:</p>
<pre><code>Buffer::macheX(GlContext &amp;gc, ...)
</code></pre>
<p>oder</p>
<pre><code>GlContext::bufferMacheX(Buffer &amp;buffer, ...)
</code></pre>
<p>Nun ist es sehr verlockend thread_local für das GL Kontext Objekt zu verwenden.</p>
<p>Jedoch bin ich mir nicht sicher was ich von der performance erwaten darf, da es wohl sehr unterschiedliche Implementierungen gibt.<br />
Wenn ich es benutze würde ich es auch für sehr oft aufgerufene Methoden verwenden. (Tausende mal pro Frame)</p>
<p>Also grob sind es zwei Fragen:<br />
-Gibt es einen Schnitt bei OS/Compiler wo die Implementierung einen deutlichen Verbesserung erfährt. Z.B. in XP/msvs08 sehr schlecht ab Win7/msvc10/gcc gut.</p>
<p>-Wie groß sind die Kosten auf einer guten implementierung?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330075/thread-local-zu-erwartende-performance</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 14:39:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330075.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 21 Dec 2014 07:41:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Sun, 21 Dec 2014 07:41:50 GMT]]></title><description><![CDATA[<p>Hintergrunt:<br />
Momentan entwickel ich einen OpenGL Wrapper. Ein GL Kontext ist immer an genau einen Thread gekoppelt und hat in meinem Wrapper ein eigenes State Objekt.<br />
Man muss immer zwei pointer benutzen um eine Methode der Wrapper Objekte aufzurufen. Einmal das Objekt und zweitens das GL Kontext Objekt.</p>
<p>Methoden kann man also folgendermaßen designen:</p>
<pre><code>Buffer::macheX(GlContext &amp;gc, ...)
</code></pre>
<p>oder</p>
<pre><code>GlContext::bufferMacheX(Buffer &amp;buffer, ...)
</code></pre>
<p>Nun ist es sehr verlockend thread_local für das GL Kontext Objekt zu verwenden.</p>
<p>Jedoch bin ich mir nicht sicher was ich von der performance erwaten darf, da es wohl sehr unterschiedliche Implementierungen gibt.<br />
Wenn ich es benutze würde ich es auch für sehr oft aufgerufene Methoden verwenden. (Tausende mal pro Frame)</p>
<p>Also grob sind es zwei Fragen:<br />
-Gibt es einen Schnitt bei OS/Compiler wo die Implementierung einen deutlichen Verbesserung erfährt. Z.B. in XP/msvs08 sehr schlecht ab Win7/msvc10/gcc gut.</p>
<p>-Wie groß sind die Kosten auf einer guten implementierung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433951</guid><dc:creator><![CDATA[Osbios]]></dc:creator><pubDate>Sun, 21 Dec 2014 07:41:50 GMT</pubDate></item><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Sun, 21 Dec 2014 15:38:29 GMT]]></title><description><![CDATA[<p>~~Mh für mich hört sich das nach einer schlecht gestellten Frage an. Denn wenn du zwischen mehreren Threads keine Kommunikation hast und auch alle Threads etwa gleich ausgelastet sind, dann sehe ich keinen Grund warum eins schneller als das andere sein sollte.</p>
<p>Ich muss allerdings auch dazu sagen, dass ich quasi keine Ahnung von OpenGL(-Contexten) habe.~~</p>
<p>Edit: komplett falscher Context</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433953</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 21 Dec 2014 15:38:29 GMT</pubDate></item><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Sun, 21 Dec 2014 10:33:03 GMT]]></title><description><![CDATA[<p>Beim GCC kostet das quasi nichts, sofern alles in der gleichen ÜE passiert.</p>
<p>Besser als globaler State ist aber immer, ihn zu vermeiden. Warum nicht</p>
<pre><code class="language-cpp">struct BufferContextPair {
  GlContext *gc;
  Buffer *buffer;
};
</code></pre>
<p>oder so ähnlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433969</guid><dc:creator><![CDATA[goforit]]></dc:creator><pubDate>Sun, 21 Dec 2014 10:33:03 GMT</pubDate></item><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Sun, 21 Dec 2014 10:42:46 GMT]]></title><description><![CDATA[<p>Osbios schrieb:</p>
<blockquote>
<p>Ein GL Kontext ist immer an genau einen Thread gekoppelt und hat in meinem Wrapper ein eigenes State Objekt.</p>
</blockquote>
<p>Warum? Der Kontext beschreibt doch den Zustand des Objekts, auf dem du pinselst, nicht den Zustand eines Threads.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2433973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2433973</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sun, 21 Dec 2014 10:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Sun, 21 Dec 2014 15:35:55 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Ich muss allerdings auch dazu sagen, dass ich quasi keine Ahnung von OpenGL(-Contexten) habe.</p>
</blockquote>
<p>Oder von thread_local! <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>goforit schrieb:</p>
<blockquote>
<p>Beim GCC kostet das quasi nichts, sofern alles in der gleichen ÜE passiert.</p>
<p>Besser als globaler State ist aber immer, ihn zu vermeiden. Warum nicht</p>
<pre><code class="language-cpp">struct BufferContextPair {
  GlContext *gc;
  Buffer *buffer;
};
</code></pre>
<p>oder so ähnlich?</p>
</blockquote>
<p>Was ist mit ÜE gemeint?<br />
Soweit ich verstehe benutzt gcc ein register als Offset zum TLS und/oder pthread mapt einen Speicherbereich per thread. Also entsprechend schnell.<br />
Wie macht das msvc/windows?</p>
<p>Warum sollte ich thread-globale Variablen vermeiden wenn sie genau dass sind was ich haben möchte?</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Warum? Der Kontext beschreibt doch den Zustand des Objekts, auf dem du pinselst, nicht den Zustand eines Threads.</p>
</blockquote>
<p>Nein. GL hat sehr viele globale States. Unter anderem z.B. das Objekt was gerade aktiv ist welches man verändern möchte. Erst ab GL 4.5 hat man für fast alles Direct State Access Funktionen. Ich benutze jedoch als minimum GL 3.3.</p>
<p>Und daher muss ich für den GL context des jeweiligen Threads die States speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434039</guid><dc:creator><![CDATA[Osbios]]></dc:creator><pubDate>Sun, 21 Dec 2014 15:35:55 GMT</pubDate></item><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Mon, 22 Dec 2014 14:11:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Was ist mit ÜE gemeint?</p>
</blockquote>
<p>Geraten: Übersetzungs-Einheit</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2434184</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434184</guid><dc:creator><![CDATA[Unreg]]></dc:creator><pubDate>Mon, 22 Dec 2014 14:11:18 GMT</pubDate></item><item><title><![CDATA[Reply to thread local: Zu erwartende performance? on Mon, 22 Dec 2014 17:10:38 GMT]]></title><description><![CDATA[<p>Habe mit VirtualBox auf XP getestet und konnte keinen Performance Unterschied zu Win7 feststellen.</p>
<p>Was man bei <strong>thread_local</strong> bzw. <strong>__thread</strong> oder <strong>__declspec(thread)</strong> beachten muss, ist das es für jeden Thread Speicher verbraucht. Ich habe auf Win7/Ubuntu vielfachen Speicherverbrauch gehabt als ob es min. 2-3 unsichtbare Threads gab.<br />
In Windows Programmen hatte ich manchmal sehr lange Ladezeiten und extremen Speicherverbrauch wenn thread_local mehrere MB groß war.</p>
<p>Daher benutze ich in meinem Fall nun Pointer.</p>
<p>Die Klasse mit all den States wird dann im scope eines Threads (welcher einen GL Context hat) erstellt und setzt den Pointer auf sich selber.<br />
Nun kann ich mein Interface etwas hübscher gestallten:</p>
<pre><code>thread_local ContextState threadContextState;
Buffer::macheX(...)
{
  threadContextState-&gt;benutzeIrgendwasWovonDerUserNixMitbekommenMuss();
}
void thread1()
{
  ContextState meinContextState; //Constructor setzt threadContextState auf sich selber
  Buffer b;
  b.macheX();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2434217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2434217</guid><dc:creator><![CDATA[Osbios]]></dc:creator><pubDate>Mon, 22 Dec 2014 17:10:38 GMT</pubDate></item></channel></rss>