<?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[[gelöst] Verschachtelte For-Schleife parallelisieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit der Parallelisierung von For-Schleifen mit OpenMP. Ich habe eine Funktion erstellt, die ein Bild mit einem Gauß-Kernel glättet. Da der Kernel groß werden kann ist die Berechnung sehr zeitintensiv und ich würde es daher gerne parallelisieren. Schematisch ist der serielle Code der folgende:</p>
<pre><code class="language-cpp">for(int y; y &lt; height; y++)
    for(int x; x &lt; width; x++)
    {
        for(mask_y; mask_y &lt; mask_size; mask_y)
            for(mask_x; mask_x &lt; mask_size; mask_x)
            {
                dFilter += bild(mask_x,mask_y) * kernel;
            }
            bild(x,y) = dFilter
    }
</code></pre>
<p>Ich würde gerne die äußerste Schleife parallelisieren, bin mir aber nicht ganz sicher ob die Summenbildung in der innersten noch das macht was sie soll. Könntet ihr mir da bitte helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291717/gelöst-verschachtelte-for-schleife-parallelisieren</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 14:06:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291717.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 25 Aug 2011 08:25:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 12:52:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit der Parallelisierung von For-Schleifen mit OpenMP. Ich habe eine Funktion erstellt, die ein Bild mit einem Gauß-Kernel glättet. Da der Kernel groß werden kann ist die Berechnung sehr zeitintensiv und ich würde es daher gerne parallelisieren. Schematisch ist der serielle Code der folgende:</p>
<pre><code class="language-cpp">for(int y; y &lt; height; y++)
    for(int x; x &lt; width; x++)
    {
        for(mask_y; mask_y &lt; mask_size; mask_y)
            for(mask_x; mask_x &lt; mask_size; mask_x)
            {
                dFilter += bild(mask_x,mask_y) * kernel;
            }
            bild(x,y) = dFilter
    }
</code></pre>
<p>Ich würde gerne die äußerste Schleife parallelisieren, bin mir aber nicht ganz sicher ob die Summenbildung in der innersten noch das macht was sie soll. Könntet ihr mir da bitte helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110444</guid><dc:creator><![CDATA[Nemic]]></dc:creator><pubDate>Thu, 25 Aug 2011 12:52:38 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 10:18:25 GMT]]></title><description><![CDATA[<p>Wo ist denn dFilter definiert? Teilen sich tatsächlich alle Punkte das, oder steht das vielleicht hier</p>
<pre><code class="language-cpp">for(int x; x &lt; width; x++)
    {
       double dFilter = 0;
</code></pre>
<p>Und dann musst du dir überlegen was passiert, wenn ein Thread <code>bild(mask_x,mask_y)</code> liest und ein anderer gerade dort <code>bild(x,y) = ...</code> schreibt, wenn das vorkommen kann, dass <code>x==mask_x &amp;&amp; y == mask_y</code> .<br />
Vielleicht erweitrst du dein Bsp mal noch, dass man auch die Initialisierung und alle Typen sehen kann. Am besten was ausführbares.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110490</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 25 Aug 2011 10:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 10:25:10 GMT]]></title><description><![CDATA[<p>Der Code war wohl doch etwas zu knapp. Deine Annahme zu der Variable dfilter ist korrekt. Im Code ist außerdem noch ein Fehler, es gibt zwei Bilder (Eingabe und Ausgabe) sonst wäre es auch kein Gauß. Ich hab den Code einmal angepaßt.</p>
<pre><code class="language-cpp">for(int y = 0; y &lt; height; y++)
    for(int x = 0; x &lt; width; x++)
    {
        double dFilter = 0.0;

        //start_value ist abhängig von der Filtergröße 

        for(mask_y = start_value; mask_y &lt; mask_size; mask_y)
            for(mask_x = start_value; mask_x &lt; mask_size; mask_x)
            {
                dFilter += in_bild(mask_x,mask_y) * kernel;
            }
            out_bild(x,y) = dFilter;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2110496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110496</guid><dc:creator><![CDATA[Nemic]]></dc:creator><pubDate>Thu, 25 Aug 2011 10:25:10 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 10:36:07 GMT]]></title><description><![CDATA[<p>Nemic schrieb:</p>
<blockquote>
<p>Im Code ist außerdem noch ein Fehler, es gibt zwei Bilder (Eingabe und Ausgabe)</p>
</blockquote>
<p>Dann kannste parallelisieren wie wild.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110503</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 25 Aug 2011 10:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 10:36:13 GMT]]></title><description><![CDATA[<p>Wenn mask_x und mask_y noch innerhalb der Schleife definiert sind, sollte es kein Problem geben. Es sei denn Bild::operator()(int, int) hat irgendeinen Nebeneffekt, der synchronisiert werden muss.</p>
<pre><code class="language-cpp">const double kernel = Kernel();
const int start_value = start(filtergroesse);
for(int y = 0; y &lt; height; y++)
    for(int x = 0; x &lt; width; x++)
    {
        double dFilter = 0.0;
        for(int mask_y = start_value; mask_y &lt; mask_size; ++mask_y)
            for(int mask_x = start_value; mask_x &lt; mask_size; ++mask_x)
            {
                dFilter += in_bild(mask_x,mask_y) * kernel;
            }
            out_bild(x,y) = dFilter;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2110505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110505</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Thu, 25 Aug 2011 10:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 11:41:47 GMT]]></title><description><![CDATA[<p>Zum Verständnis, wenn ich dann so parallelisiere:</p>
<pre><code class="language-cpp">const double kernel = Kernel();
const int start_value = start(filtergroesse);
int x = 0;

#pragma omp parallel for private(x)
for(int y = 0; y &lt; height; y++)
    for(x = 0; x &lt; width; x++)
    {
        double dFilter = 0.0;
        for(int mask_y = start_value; mask_y &lt; mask_size; ++mask_y)
            for(int mask_x = start_value; mask_x &lt; mask_size; ++mask_x)
            {
                dFilter += in_bild(mask_x,mask_y) * kernel;
            }
            out_bild(x,y) = dFilter;
    }
</code></pre>
<p>was wird dann genau parallel bearbeitet? Meine Vermutung ist, dass die äußerste Schleife aufgeteilt wird und vereinfacht gesprochen jeder Thread einen Durchlauf dieser Schleife bearbeitet. Ist das korrekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110543</guid><dc:creator><![CDATA[Nemic]]></dc:creator><pubDate>Thu, 25 Aug 2011 11:41:47 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 11:53:06 GMT]]></title><description><![CDATA[<p>in dem Fall werden verschiedene Zeilen des Bildes parallel berechnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110549</guid><dc:creator><![CDATA[gastgast]]></dc:creator><pubDate>Thu, 25 Aug 2011 11:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verschachtelte For-Schleife parallelisieren on Thu, 25 Aug 2011 12:03:42 GMT]]></title><description><![CDATA[<p>Damit ist mir sehr geholfen, vielen Dank an alle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2110551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2110551</guid><dc:creator><![CDATA[Nemic]]></dc:creator><pubDate>Thu, 25 Aug 2011 12:03:42 GMT</pubDate></item></channel></rss>