<?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[gpu-nutzung für rechenintensiven code]]></title><description><![CDATA[<p>ich befasse mich jetzt seit einigen tagen mit dem thema gpu(grafikprozessor)-nutzung für normale programmaufgaben.<br />
siehe: <a href="http://de.wikipedia.org/wiki/GPGPU" rel="nofollow">http://de.wikipedia.org/wiki/GPGPU</a></p>
<p>der grund ist ein c-programm, das ich geschrieben habe und das auf &quot;normalen&quot; cpus einfach zu langsam abläuft (denke es ist halbwegs optimiert).<br />
es gibt zur gpu-programmierung ja mehrere projekte wie z.b. brookgpu, gpgpu, libsh und das daraus entstandene rapidmind. ich tendiere dahin, es mit der opengl shading-language zu versuchen, da man damit ja auch die shader der gpu programmieren kann. was ich jetzt brauche sind gute und einfache code-beispiele, wie ich in einem c oder c++ -programm z.b. folgende sachen auf gpu-basis machen kann:</p>
<p>* permanentes auslagern von arrays bzw. speicherbereichen in den grafikspeicher<br />
und zugriff vom programm darauf<br />
* durchwandern von arrays mit wertabhängigen aktionen(das setzen von werten oder abbruch und rücksetzen der bisher gesetzen werte)</p>
<p>in meinem programm muss in dem rechenintensiven part ein byte-array(4mb) durchlaufen werden und werteabhängig folgendes gemacht werden:<br />
wenn wert=0, dann mit 1 setzen; wenn 1, dann alle bisher gesetzten einser rückgängig machen. es geht halt darum, einen bestimmten bereich des arrays mit 1 zu füllen, der vorher komplett 0er enthalten muss.<br />
dieser vorgang muss sehr oft durchlaufen werden, ca. 10^50, wobei aber der grossteil der varianten durch meine tiefensuche von vorneherein verworfen wird.</p>
<p>normalerweise wird in den programmbeispielen für die gpu-programmierung nur<br />
die umsetzung eines array-durchlaufs mit updaten der elemente über eine gleichbleibende formel dargestellt. für mein problem, mit der dynamischen anpassung der elemente (rückgangigmachen bisher veränderter elemente) beim array-durchlauf hab ich bisher nichts gefunden. auch ist da noch das problem mit dem parallenen durchlauf des arrays seitens der gpu. diese teilt ja dann den durchlauf in z.b. 8 asynchrone prozesse auf, die dann ja auch unterschiedlich weit mit ihrer arbeit sind, wenn z.b. prozess 3 aufgrund einer endscheidung seine bisher gefüllten arrayelemente wieder leerern soll. die anderen prozesse müssten dann gleichziehen und ihre aktuelle arbeit einstellen und ebenfalls alles rückgängig machen. wie kann man das realisieren?</p>
<p>also wenn sich jemand damit gut auskennt und sowas in der art schonmal programmiert hat, wäre es schön wenn er mir helfen könnte.</p>
<p><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/topic/172296/gpu-nutzung-für-rechenintensiven-code</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Jul 2026 09:49:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/172296.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Feb 2007 15:19:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Sat, 03 Feb 2007 15:41:10 GMT]]></title><description><![CDATA[<p>ich befasse mich jetzt seit einigen tagen mit dem thema gpu(grafikprozessor)-nutzung für normale programmaufgaben.<br />
siehe: <a href="http://de.wikipedia.org/wiki/GPGPU" rel="nofollow">http://de.wikipedia.org/wiki/GPGPU</a></p>
<p>der grund ist ein c-programm, das ich geschrieben habe und das auf &quot;normalen&quot; cpus einfach zu langsam abläuft (denke es ist halbwegs optimiert).<br />
es gibt zur gpu-programmierung ja mehrere projekte wie z.b. brookgpu, gpgpu, libsh und das daraus entstandene rapidmind. ich tendiere dahin, es mit der opengl shading-language zu versuchen, da man damit ja auch die shader der gpu programmieren kann. was ich jetzt brauche sind gute und einfache code-beispiele, wie ich in einem c oder c++ -programm z.b. folgende sachen auf gpu-basis machen kann:</p>
<p>* permanentes auslagern von arrays bzw. speicherbereichen in den grafikspeicher<br />
und zugriff vom programm darauf<br />
* durchwandern von arrays mit wertabhängigen aktionen(das setzen von werten oder abbruch und rücksetzen der bisher gesetzen werte)</p>
<p>in meinem programm muss in dem rechenintensiven part ein byte-array(4mb) durchlaufen werden und werteabhängig folgendes gemacht werden:<br />
wenn wert=0, dann mit 1 setzen; wenn 1, dann alle bisher gesetzten einser rückgängig machen. es geht halt darum, einen bestimmten bereich des arrays mit 1 zu füllen, der vorher komplett 0er enthalten muss.<br />
dieser vorgang muss sehr oft durchlaufen werden, ca. 10^50, wobei aber der grossteil der varianten durch meine tiefensuche von vorneherein verworfen wird.</p>
<p>normalerweise wird in den programmbeispielen für die gpu-programmierung nur<br />
die umsetzung eines array-durchlaufs mit updaten der elemente über eine gleichbleibende formel dargestellt. für mein problem, mit der dynamischen anpassung der elemente (rückgangigmachen bisher veränderter elemente) beim array-durchlauf hab ich bisher nichts gefunden. auch ist da noch das problem mit dem parallenen durchlauf des arrays seitens der gpu. diese teilt ja dann den durchlauf in z.b. 8 asynchrone prozesse auf, die dann ja auch unterschiedlich weit mit ihrer arbeit sind, wenn z.b. prozess 3 aufgrund einer endscheidung seine bisher gefüllten arrayelemente wieder leerern soll. die anderen prozesse müssten dann gleichziehen und ihre aktuelle arbeit einstellen und ebenfalls alles rückgängig machen. wie kann man das realisieren?</p>
<p>also wenn sich jemand damit gut auskennt und sowas in der art schonmal programmiert hat, wäre es schön wenn er mir helfen könnte.</p>
<p><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/1222258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1222258</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Sat, 03 Feb 2007 15:41:10 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Sun, 04 Feb 2007 16:22:46 GMT]]></title><description><![CDATA[<p>was auch immer du machst, ich glaube du bist eher bandbreiten limitiert, also von der rechenleistung, wenn du nur 0 und 1 hast, benutz ein gepacktes array, das wird um faktoren schneller sein als was du gerade hast.</p>
<p>eine gpu arbeitet als streaming prozessor, du hast eingangsdaten und ausgangsdaten, die sind seperat und koennen ohne unvorhersehbare ergebnisse nicht vermischt werden (und die oeffentlich erhaeltlichen APIs erlauben das auch nicht). und ja, die pixelprozessoren arbeiten immer in gruppen, je nach gpu koennen das ein paar tausend streams sein die gleich abgehandelt werden. du must also auch einen algoirhmus haben der das unterstuetzt, einfach nur c-algorithmen umzusetzen duerfte sehr langsam werden.</p>
<p>10^50 durchlaeufe eines 4MB arrays hmmm<br />
4* 10^56Byte<br />
sagen wir mal du hast nen guten speicher mit 4gb/s bleiben also<br />
10^47s<br />
ca 10^42 tage</p>
<p><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>da kannst du gleich rsa hacken <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/1222771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1222771</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Sun, 04 Feb 2007 16:22:46 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 10:08:40 GMT]]></title><description><![CDATA[<p>den vorschlag mit dem gepackten array kann ich ja mal ausprobieren.<br />
problem hierbei: k.a. was ein gepacktes array ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
meinst du damit, das ich ein byte-array deklariere und durch bitmanipulation 8 werte pro byte-element speichern soll, oder gibt es eine andere vorgehensweise?</p>
<p>und die laufzeit mit 10^50 wird ja wie ich im ersten post geschrieben hab, nie vollständig durchiteriert. er verwierft ja in der tiefensuche komplette unterbäume, wenn z.b. ein vaterknoten nicht zutrifft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223114</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Mon, 05 Feb 2007 10:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 12:04:16 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<p>meinst du damit, das ich ein byte-array deklariere und durch bitmanipulation 8 werte pro byte-element speichern soll, oder gibt es eine andere vorgehensweise?</p>
</blockquote>
<p>ja, das meinte ich damit, besser eventuell sogar int mit 32bit pro eintrag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223183</guid><dc:creator><![CDATA[rapso@work]]></dc:creator><pubDate>Mon, 05 Feb 2007 12:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 16:45:05 GMT]]></title><description><![CDATA[<p>habs gerade programmiert, ist leider nicht schneller -wahrscheinlich sogar einen tick langsamer weil er ja immer erst die elementnummer und die bitposition des richtigen arrayelementes aus der gegebenen absolutposition ermitteln muss.</p>
<p>er ging vorher hintereinander ca. 4.000.000 byteelemente durch, um das 1. element mit dem wert 0 zu finden, jetzt ist es ja dasselbe: er muss 4.000.000 bitelemente durchgehen. also ein speicherzugriff pro iteration. ob er dabei auf ein byte, dword oder bit zugreift ist ja egal, da es eben ein speicherzugriff ist.<br />
ich kann das auch nicht dword-weise machen, weil eben jede position einzeln geprüft werden muss.</p>
<p>aber ich hatte vorhin eine gute idee um den speed doch noch zu erhöhen, weiss aber nicht wie man das umsetzt, bzw. ob überhaupt möglich:</p>
<p>durch die bitvariante ist das array jetzt nur noch 502,39kb gross (vorher ca. 4019).<br />
wenn ich es schaffe, das array in den L2-cache meiner cpu zu kriegen(athlon64x2 toledo-hat 1mb L2), kann er alle zugriffe darüber mit vollem prozessortakt machen und das ist ja das schnellste was geht.</p>
<p>kann man sowas irgentwie festlegen? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1223361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223361</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Mon, 05 Feb 2007 16:45:05 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 17:13:30 GMT]]></title><description><![CDATA[<blockquote>
<p>. ob er dabei auf ein byte, dword oder bit zugreift ist ja egal, da es eben ein speicherzugriff ist.</p>
</blockquote>
<p>Geht das nicht das du ein Integer ausliest (32bit), dann diese 32 Bits prüfst, und dann den nächsten Integer ausliest? So würde man Speicherzugriffe drastisch reduzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223391</guid><dc:creator><![CDATA[DEvent]]></dc:creator><pubDate>Mon, 05 Feb 2007 17:13:30 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 17:41:38 GMT]]></title><description><![CDATA[<p>das wäre mit anfwand möglich. allerdings denke ich, das es auch nichts bringt, weil ja anstatt der n zugriffe auf die arrayelemente ein n-facher zugriff auf die puffervariable mit dem jeweils zuletzt gelesenen array-element erfolgt.</p>
<p>und diese variable liegt doch auch im hauptspeicher -er muss auch einen speicherzugriff durchführen. ob ich nun auf eine lokale variable oder ein arrayfeld zugreife, es ist immer ein speicherzugriff nötig, oder nicht?</p>
<p>glaube nicht, das der compiler gewisse variableninhale in prozessorregister auslagert, wenn er erkennt das die oft benutzt werden. man hat ja unter x86 nicht viele register zur verfügung, im vergleich zum powerpc.</p>
<p>aber ich lass mich auch gern eines besseren belehren. <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/1223407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223407</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Mon, 05 Feb 2007 17:41:38 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 19:24:27 GMT]]></title><description><![CDATA[<p>Also was Speicherzugriffe angeht sind eigentlich nur Cache-Misses interessant.<br />
Ob man dann einen Wert den man gerade eben gelesen/geschrieben hat nun nochmal angreift ist dabei egal - was im L1 Cache steht ist &quot;sofort&quot; da, was im L2 Cache steht ist &quot;ziemlich flott&quot; da. L1 Cache vs. Register ist von der Zugriffsgeschwindigkeit ziemlich egal.</p>
<p>Guck mal im Google nach &quot;cache aware&quot;, da gibts etliche Artikel drüber.</p>
<p>Ich denke das wichtigste ist dass du den Algorithmus so hinbringst dass er mit möglichst wenig Cache Misses läuft. Optimal ist wenn die meiste Arbeit auf kleinen Speicherblöcken durchgeführt werden kann, und dass grössere Blöcke möglichst linear durchgegangen werden. Unkontrolliert im Speicher rumspringen ist so ziemlich das schlimmste was du machen kannst.</p>
<p>Ein paar einfache Dinge die daraus folgen sind z.B. dass Arrays &quot;gut&quot; sind, dass &quot;divide &amp; conquer&quot; auch &quot;gut&quot; ist, dass Listen &quot;böse&quot; sind, dass Pointer allgemein &quot;böse&quot; sind... Also viel mit Value-Semantics arbeiten, wenig mit Pointern etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223463</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 05 Feb 2007 19:24:27 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Mon, 05 Feb 2007 21:23:34 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<p>durch die bitvariante ist das array jetzt nur noch 502,39kb gross (vorher ca. 4019).</p>
</blockquote>
<p>ja, da hatte ich echt ne gute idee <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>das wäre mit anfwand möglich. allerdings denke ich, das es auch nichts bringt, weil ja anstatt der n zugriffe auf die arrayelemente ein n-facher zugriff auf die puffervariable mit dem jeweils zuletzt gelesenen array-element erfolgt.</p>
</blockquote>
<p>wenn du es schlau anstellst, liegt diese variable im register und das ist der zweite grund weshalb man mehrere bits in eine 32bit variable steckt <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>Also was Speicherzugriffe angeht sind eigentlich nur Cache-Misses interessant.<br />
Ob man dann einen Wert den man gerade eben gelesen/geschrieben hat nun nochmal angreift ist dabei egal - was im L1 Cache steht ist &quot;sofort&quot; da, was im L2 Cache steht ist &quot;ziemlich flott&quot; da. L1 Cache vs. Register ist von der Zugriffsgeschwindigkeit ziemlich egal.</p>
</blockquote>
<p>nein, es haengt zwar von der cpu ab, aber variablen im L1 haben ebenfalls eine zugrifszeit die um einiges ueber der eines registers liegt (in das auch erstmal geladen wird).<br />
wobei CPUs vieles davon mit virtuellen registern verdecken (ein P4 soll angaeblich ueber 200 register intern haben).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1223534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1223534</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Mon, 05 Feb 2007 21:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Wed, 07 Feb 2007 16:16:11 GMT]]></title><description><![CDATA[<blockquote>
<p>ja, da hatte ich echt ne gute idee</p>
</blockquote>
<p>nein, der code war danach ja langsamer.</p>
<blockquote>
<p>wenn du es schlau anstellst, liegt diese variable im register und das ist der zweite grund weshalb man mehrere bits in eine 32bit variable steckt</p>
</blockquote>
<p>es kann mir keiner garantieren, das er variable &quot;n&quot; in ein register steckt. also ist es auch kein zweiter grund.</p>
<p>sorry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224540</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Wed, 07 Feb 2007 16:16:11 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Wed, 07 Feb 2007 16:54:32 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<blockquote>
<p>wenn du es schlau anstellst, liegt diese variable im register und das ist der zweite grund weshalb man mehrere bits in eine 32bit variable steckt</p>
</blockquote>
<p>es kann mir keiner garantieren, das er variable &quot;n&quot; in ein register steckt. also ist es auch kein zweiter grund.</p>
</blockquote>
<p>Garantiert vielleicht nicht. Aber doch ziemlich sicher. Zumindest gibt das dem Compiler die Chance eine solche Optimierung überhaupt durchzuführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224578</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 07 Feb 2007 16:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Wed, 07 Feb 2007 17:41:24 GMT]]></title><description><![CDATA[<p>ich hab ja den verdacht, das er das ganze array sowiso schon im l2-cache hat.<br />
und demendsprechend dumm würde ich mir dann vorkommen, wenn nach umschreiben auf assembler der speedgewinn +-0 ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224605</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Wed, 07 Feb 2007 17:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Wed, 07 Feb 2007 17:55:43 GMT]]></title><description><![CDATA[<p>Was hat das damit zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224615</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 07 Feb 2007 17:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Wed, 07 Feb 2007 18:48:20 GMT]]></title><description><![CDATA[<p>es ging in den letzten posts doch darum, das ich durch weiteres umschreiben meines programms in richtung zitat:</p>
<blockquote>
<p>Geht das nicht das du ein Integer ausliest (32bit), dann diese 32 Bits prüfst, und dann den nächsten Integer ausliest? So würde man Speicherzugriffe drastisch reduzieren.</p>
</blockquote>
<p>die laufzeit verbessern könnte und meine zweifel daran aufgrund der problematik &quot;variable in register&quot;. und um 100%ig sicherzustellen, das er die variable in ein register packt, müsste ich das programm in assember umschreiben. und weil ich eben den verdacht habe, das sowiso schon alles im cache abläuft, äußerte ich meine sorge über die viele nutzlose arbeit darüber wenn es dann doch nicht schneller ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224654</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Wed, 07 Feb 2007 18:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Wed, 07 Feb 2007 22:09:48 GMT]]></title><description><![CDATA[<p>Lass das mal ein Problem des Compilers sein. Du kannst Dir ziemlich sicher sein, dass die im Register landet. Da mit asm dranzugehen lohnt sich ziemlich sicher nicht. Ne Hochsprache reicht da vollkommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224771</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Wed, 07 Feb 2007 22:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Thu, 08 Feb 2007 06:24:22 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<blockquote>
<p>ja, da hatte ich echt ne gute idee</p>
</blockquote>
<p>nein, der code war danach ja langsamer.</p>
</blockquote>
<p>dann hast du es eventuell falsch implementiert oder dein cache ist zu klein.</p>
<pre><code class="language-cpp">//falsch
for...
  if(Array[i&gt;&gt;5]&amp;(1&lt;&lt;(i&amp;0x1f))

//richtig
for...
register uint32_t Tmp=Array[i&gt;&gt;5];
 for(j=0;j&lt;32;j++)
  if(Tmp&amp;(1&lt;&lt;j)
</code></pre>
<p>man koennte zwar meinen dass das erste wegoptimiert werden koennte, aber heutzutage haben sich die compiler echt bitchy mit aliasing.</p>
<p>wenn du den zweiten loop ausschreibst koennte das auch was bringen.</p>
<blockquote>
<blockquote>
<p>wenn du es schlau anstellst, liegt diese variable im register und das ist der zweite grund weshalb man mehrere bits in eine 32bit variable steckt</p>
</blockquote>
<p>es kann mir keiner garantieren, das er variable &quot;n&quot; in ein register steckt. also ist es auch kein zweiter grund.</p>
</blockquote>
<p>solange du dir das ganze nicht im profiler anschaust ist eh jede optimierung nur ein schuss ins blaue.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1224823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1224823</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Thu, 08 Feb 2007 06:24:22 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Thu, 08 Feb 2007 17:06:42 GMT]]></title><description><![CDATA[<p>das problem ist, das ich den array-inhalt nicht am stück auf werte testen kann, sondern das sich die werte in fragmenten im array befinden. der grund ist der, daß das array den inhalt eines &quot;holzkastens (175x157x147)&quot; darstellt und rechteckige objekte aufnimmt. wenn ein objekt reinkommt, muss ich das über 3 schleifen machen um den jeweils richtigen startoffset zum einfügen zu finden.<br />
der wichtige teil (x,y,z sind die länge, breite und höhe des einzusetzenden steines, setzposition ist die nächste freie position nach dem schema: von links unten beginnen und reihenweise füllen):</p>
<pre><code>// stein einsetzen
	for (ze=0;ze&lt;z;ze++)
		for (ye=0;ye&lt;y;ye++)
			for (xe=0;xe&lt;x;xe++)
			{
				position=*setzposition+(ze*27808)+(ye*176)+xe;
				// prüfen, ob an der einfügeposition schon &quot;holz&quot; ist
				if ( kasten[position] != 0 )
				{
					// alle bisher eingefügten teile des steins wieder entfernen
					positionBackup=position;

					for (ze=0;ze&lt;z;ze++)
						for (ye=0;ye&lt;y;ye++)
							for (xe=0;xe&lt;x;xe++)
							{
					            position=*setzposition+(ze*27808)+(ye*176)+xe;
								if ( position==positionBackup ) return 0;
								kasten[position]=0;
							}
				}

    			kasten[position]=1;
			}

    //---die nächste freie setzposition ermitteln---
	for(i=*setzposition;i&lt;4115584;i++)
		if ( kasten[i] == 0 )
		{
			*setzposition=i;
			break;
		}
	//----------------------------------------------
</code></pre>
<p>obiger code ist meine alte byte-variante, und die ist 12 sekunden schneller(es wurden die ersten paar millionen iterationen durchlaufen) als die neue bit-variante:</p>
<pre><code>// stein einsetzen
	for (ze=0;ze&lt;z;ze++)
		for (ye=0;ye&lt;y;ye++)
			for (xe=0;xe&lt;x;xe++)
			{
				position=*setzposition+(ze*27808)+(ye*176)+xe;
				// die genaue bitposition ermitteln
				dwordNr=position/32;
				bitNr=position-(dwordNr*32);

				// prüfen, ob an der einfügeposition schon &quot;holz&quot; ist
				if ( (kasten[dwordNr] &amp; (eins&lt;&lt;bitNr)) !=0 )
				{
					// alle bisher eingefügten teile des steins wieder entfernen
					positionBackup=position;

					for (ze=0;ze&lt;z;ze++)
						for (ye=0;ye&lt;y;ye++)
							for (xe=0;xe&lt;x;xe++)
							{
					            position=*setzposition+(ze*27808)+(ye*176)+xe;
								if ( position==positionBackup ) return 0;

                                // die genaue bitposition ermitteln
								dwordNr=position/32;
								bitNr=position-(dwordNr*32);
								kasten[dwordNr]=kasten[dwordNr] &amp; ~(eins&lt;&lt;bitNr);  // inhalt des kastens ist leer (0)
							}
				}

    			kasten[dwordNr]=kasten[dwordNr] | (eins&lt;&lt;bitNr);
			}

    //---die nächste freie setzposition ermitteln---
	for(i=*setzposition;i&lt;4115584;i++)
	{
        // die genaue bitposition ermitteln
		dwordNr=i/32;
		bitNr=i-(dwordNr*32);

		if ( (kasten[dwordNr] &amp; (eins&lt;&lt;bitNr)) ==0 )
		{
			*setzposition=i;
			break;
		}
	}
	//----------------------------------------------
</code></pre>
<p>wenn ich jetzt die bits noch in 32bit-häppchen prüfe, wird alles durch die zusätzliche kontroll-logik noch langsamer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225180</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Thu, 08 Feb 2007 17:06:42 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 11:06:48 GMT]]></title><description><![CDATA[<p>dein code ist ein wenig unoptimal vom algorithmus her.</p>
<p>1. du pruefst immer byte-weise und setzt gleich den wert. falls da doch etwas nicht frei ist, loescht du wieder alles, das mag eventuell gut laufen wenn noch viel frei ist, aber sobald dein raum ein wenig dichter bepackt ist, ist das unperformant weil:<br />
- du hast im innerste loop ein IF und zudem ein RETURN, das kann die pipeline sehr zerschiessen<br />
- du schreibst oft in die bytes, was schon vorher drinnen stand, naemlich 0. das weiss der cache aber nicht, fuer den sind es neue zahlen, falls eine speicherbank im cache also neue werte cachen soll, muessen die alten zuerueckgeschrieben werden was zeitverschwendung ist. wenn du erst garnicht reinschreiben wuerdest, waer dieses aufwendige arbeit erstmal erspart.<br />
- du reihst deine volumes scheinbar sehr eng aneinander damit es effizient ist, die wahrscheinlichkeit dass mitten im volume ein byte gesetzt ist, geht gegen 0</p>
<p>2. du nutzt die vorteile garnicht aus die dir ein gepacktes byte gibt.</p>
<p>mein vorschlag:<br />
1. such erst die freie stelle, fuelle sie dann erst mit werten wenn du sie gefunden hast<br />
2. pruefe erst die kanten (also die linien zwischen den eckpunkten), pruefe dann die seitenflaechen, pruefe nicht das volumen (fuellen musst es weiterhin falls du ein einfuegeposition findest!)<br />
3. rechne dir die laenge der seiten in bytes um und nutze das dann aus, also</p>
<pre><code class="language-cpp">kasten[dwordNr&gt;&gt;3]==255 -&gt; return 0
kasten[dwordNr&gt;&gt;3]!=0 -&gt; pruefe bitweise
(ansonsten ist kasten[dwordNr&gt;&gt;3]==0 -&gt; kannst naechste 8 voxel testen
</code></pre>
<p>diese highlevel optimierungen sollten dir x mal mehr performance bringen als deine bruteforce methode auf heutigen GPUs je schaffen kann.</p>
<p>(btw. das sind vorschlaege, kein flame <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/1225602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225602</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Fri, 09 Feb 2007 11:06:48 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 11:56:35 GMT]]></title><description><![CDATA[<blockquote>
<p>du schreibst oft in die bytes, was schon vorher drinnen stand, naemlich 0</p>
</blockquote>
<p>nein, das kommt nie vor. ich fange mit dem einfügen eines objektes immer an der nächsten freien einfügeposition an. am anfang ist das x=0,y=0,z=0 (linke untere kastnecke). dann fülle ich die leeren kastenpositionen (0) mit 1. wenn rauskommt, das an der nächsten einfügeposition schon eine 1 ist, liegt dort schon ein teil eines anderen objektes und dann entferne ich alle bisher eingefügten punkte des akteullen objektes. ich überschreibe dann wieder die bisher eingefügten einser mit 0, aber niemals 0 mit 0.</p>
<blockquote>
<p>such erst die freie stelle, fuelle sie dann erst mit werten wenn du sie gefunden hast</p>
</blockquote>
<p>das mache ich ja schon. am anfang ist die erste einfügeposition wie oben beschrieben 0,0,0. wenn ich ein objekt eingefügt hab, ermittle ich gleich danach die nächste freie position. die ist immer rechts neben der alten und liegt auf der x-ebene, wenn dort nichts mehr frei ist, versuche ich in der nächsten reihe an der tiefsten y-position den stein einzufügen. ich fülle praktisch erst eine ebene komplett, bevor ich zur nächsten gehe.</p>
<p>es ist ein holzpuzzle, in dem 23 steine so eingefügt werden müssen, das sie mit der oberkante des kastens bündig abschliessen. es gibt keine hohlräume und meines wissens nach nur eine lösung.<br />
deshalb gibt es eine reihenfolge der 23 steine, in der man diese in den kasten einräumt um das puzzle zu lösen.</p>
<p>das teil ist es:<br />
<a href="http://home.comcast.net/~billcutler/stock/boxedbox-dv.html" rel="nofollow">http://home.comcast.net/~billcutler/stock/boxedbox-dv.html</a></p>
<p>ich hab zwar eine lösung(kein programm, durch knobeln gelösst) im internet gefunden, will das teil aber auch selbst durchrechnen. ein anderes holzpuzzle nach demselben schema rechnet er in 4s durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225625</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Fri, 09 Feb 2007 11:56:35 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 16:07:33 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<blockquote>
<p>du schreibst oft in die bytes, was schon vorher drinnen stand, naemlich 0</p>
</blockquote>
<p>nein, das kommt nie vor.</p>
</blockquote>
<p>doch da schreibst du es selbst:</p>
<blockquote>
<p>dann fülle ich die leeren kastenpositionen (0) mit 1. ...ich überschreibe dann wieder die bisher eingefügten einser mit 0,</p>
</blockquote>
<p>also steht im cache am fang 0 und beim zurueckschreiben 0, auf jedenfalls ist diese arbeit totale zeitvergoldung.</p>
<blockquote>
<blockquote>
<p>such erst die freie stelle, fuelle sie dann erst mit werten wenn du sie gefunden hast</p>
</blockquote>
<p>das mache ich ja schon.</p>
</blockquote>
<p>nein, du weisst noch nicht ob ein objekt passen kann und schreibst schon unmengen von daten nur um sie gleich danach wieder mit 0 zu fuellen.<br />
such erst einen freien raum und wenn du ihn hast, erst dann fuelle ihn mit einsen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225779</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Fri, 09 Feb 2007 16:07:33 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 17:54:41 GMT]]></title><description><![CDATA[<p>irgentwie reden wir aneinander vorbei. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<blockquote>
<p>also steht im cache am fang 0 und beim zurueckschreiben 0, auf jedenfalls ist diese arbeit totale zeitvergoldung.</p>
</blockquote>
<p>nein, BEIM zurückschreiben steht noch eine 1 drin, NACH dem zurückschreiben wieder 0. aber das kann man vorher nicht wissen und auch nicht verhindern.<br />
ich brauche die 1ser ja zum testen des nächsten einzufügenden steines auf kollisionen mit den vorigen.</p>
<blockquote>
<p>nein, du weisst noch nicht ob ein objekt passen kann und schreibst schon unmengen von daten nur um sie gleich danach wieder mit 0 zu fuellen.</p>
</blockquote>
<p>das stimmt teilweise. ich weiss vorher nicht, ob ein objekt in die nächste freie einfügeposition passt. aber es MUSS in diese nächste freie position passen, wenn die aktuelle steinkombination die richtige/gesuchte ist. wenn nicht, wird der teil des suchbaums verworfen und ich probiere die nächste variante mit einem anderen stein.</p>
<blockquote>
<p>such erst einen freien raum und wenn du ihn hast, erst dann fuelle ihn mit einsen.</p>
</blockquote>
<p>das wäre von der performance tödlich, würde alles wahrscheinlich um den faktor 100 verlangsamen. durch die variante mit der nächsten einfügeposition habe ich immer ohne grosses rechnen die nächste stelle. und dort MUSS wie gesagt der nächste stein reinpassen, wenn es die gesuchte kombination/lösung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225823</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Fri, 09 Feb 2007 17:54:41 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 20:25:37 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<p>irgentwie reden wir aneinander vorbei. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>ja aber ich eklaere es dir gerne so oft bis du es verstehst.</p>
<p>tenim schrieb:</p>
<blockquote>
<blockquote>
<p>also steht im cache am fang 0 und beim zurueckschreiben 0, auf jedenfalls ist diese arbeit totale zeitvergoldung.</p>
</blockquote>
<p>nein, BEIM zurückschreiben steht noch eine 1 drin, NACH dem zurückschreiben wieder 0.</p>
</blockquote>
<p>es geht immer noch um den cache und dort steht beim einlesen und am ende beim rausschreiben 0.</p>
<blockquote>
<p>aber das kann man vorher nicht wissen und auch nicht verhindern.</p>
</blockquote>
<p>doch, wie ich es schon mehrmals schrieb, erst freie stelle finden, dann die freie stelle mit einsen fuellen, nicht schon beim testen des volumens die 1 einfuegen.</p>
<blockquote>
<p>ich brauche die 1ser ja zum testen des nächsten einzufügenden steines auf kollisionen mit den vorigen.</p>
</blockquote>
<p>ja, wie ich schon sagte, wenn du fertig bist mit der suche nach einer freien stelle fuer den koerper, fuelle sie mir einsen.</p>
<blockquote>
<blockquote>
<p>nein, du weisst noch nicht ob ein objekt passen kann und schreibst schon unmengen von daten nur um sie gleich danach wieder mit 0 zu fuellen.</p>
</blockquote>
<p>das stimmt teilweise. ich weiss vorher nicht, ob ein objekt in die nächste freie einfügeposition passt. aber es MUSS in diese nächste freie position passen, wenn die aktuelle steinkombination die richtige/gesuchte ist. wenn nicht, wird der teil des suchbaums verworfen und ich probiere die nächste variante mit einem anderen stein.</p>
</blockquote>
<p>ja und hast zwischendruch unnuetzerweise unmengen einsen und nullen geschrieben.</p>
<blockquote>
<blockquote>
<p>such erst einen freien raum und wenn du ihn hast, erst dann fuelle ihn mit einsen.</p>
</blockquote>
<p>das wäre von der performance tödlich, würde alles wahrscheinlich um den faktor 100 verlangsamen. durch die variante mit der nächsten einfügeposition habe ich immer ohne grosses rechnen die nächste stelle. und dort MUSS wie gesagt der nächste stein reinpassen, wenn es die gesuchte kombination/lösung ist.</p>
</blockquote>
<p>von der performance toedlisch ist es unmengen von einsen zu setzen und sie dann zu loeschen.</p>
<p>beispiel aus der realen welt. du suchst ein perfektes regal fuer deine 24baendige herr der dinge sammlung.<br />
deine variante: in jedes regal die buecher einsortieren und falls es gegen ende zu eng wird, nimmst du die buecher wieder stueckweise raus.<br />
meine variante: erst rausfinden ob der band passen wuerde und erst dann einsetzen.</p>
<p>versuch das bitte zu verstehen. arbeit leisten, arbeit rueggaengig machen == keine arbeit machen. du machst ersteres, ich schlage zweiteres vor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1225911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1225911</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Fri, 09 Feb 2007 20:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 23:01:47 GMT]]></title><description><![CDATA[<p>ich verstehe jetzt wie du es meinst.</p>
<p>es wären durch diese optimierung dann 66% weniger schreib/lesezugriffe nötig<br />
wenn ein teil nicht reinpasst. ich probier das mal aus, mal sehen wieviel das ausmacht.</p>
<blockquote>
<p>beispiel aus der realen welt. du suchst ein perfektes regal fuer deine 24baendige herr der dinge sammlung.<br />
deine variante: in jedes regal die buecher einsortieren und falls es gegen ende zu eng wird, nimmst du die buecher wieder stueckweise raus.<br />
meine variante: erst rausfinden ob der band passen wuerde und erst dann einsetzen.</p>
</blockquote>
<p>das lässt sich aber dennoch nicht vermeiden, weil ich zwar im aktuellen fall von objekteinfügen testen kann ob es reingeht und es erst dann reinsetze, aber wenn das objekt reingeht und das nachfolgeobjekt nicht, muss ich auch das vorherige wieder entfernen. es ist sowas wie ein binärer baum mit 23 ebenen, welche die reihenfolge der steineinsetzung darstellen. wenn alles bis ebene 19 reingeht und in ebene 20 keiner der übrigen steine mehr passt muss ich auch in ebene 19 den nächsten stein nehmen und den alten vorher wieder mit 0 überschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1226000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1226000</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Fri, 09 Feb 2007 23:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Fri, 09 Feb 2007 23:09:23 GMT]]></title><description><![CDATA[<p>programm ist 3s schneller als vorher. macht leider nichts aus bei der anzahl von interationen. es müsste um den faktor 100 schneller laufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1226005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1226005</guid><dc:creator><![CDATA[tenim]]></dc:creator><pubDate>Fri, 09 Feb 2007 23:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Sat, 10 Feb 2007 01:15:46 GMT]]></title><description><![CDATA[<p>Mußt Du unbedingt die dichteste Packung finden? Oder tut's auch eine Annäherung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1226027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1226027</guid><dc:creator><![CDATA[Jester]]></dc:creator><pubDate>Sat, 10 Feb 2007 01:15:46 GMT</pubDate></item><item><title><![CDATA[Reply to gpu-nutzung für rechenintensiven code on Sat, 10 Feb 2007 02:05:37 GMT]]></title><description><![CDATA[<p>tenim schrieb:</p>
<blockquote>
<p>programm ist 3s schneller als vorher. macht leider nichts aus bei der anzahl von interationen. es müsste um den faktor 100 schneller laufen.</p>
</blockquote>
<p>hast du die andere optimierung auch eingebaut, dass nicht das volumen getestet wird, sondern nur die flaechen der aussenseiten?</p>
<p>wenn dein volumen z.b. 20*20*20 ist, hast du statt 20^3(8000) dann nur noch 6*(20^2) (2400) tests und je groesser das volumen ist, desto mehr sparst du.</p>
<p>wenn du zudem erst nur die raender testest, findest du statistisch gesehen eher heraus falls ein volumen nicht an die zu testende stelle passt. (zudem sind es dann 12*20+6*(18^2) (~2200) tests <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>wie gross ist so ein volumen das du einfuegen moechtest in etwa und wie gross die ganze box?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1226034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1226034</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Sat, 10 Feb 2007 02:05:37 GMT</pubDate></item></channel></rss>