<?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[Parallelisierung mit OpenMP]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade dabei ein paar Funktionen mittels OpenMP zu parallelisieren. Bei einigen habe ich an sich keine großen Probleme, wie bspw.:</p>
<pre><code class="language-cpp">[...]
	omp_set_num_threads(4);
	#pragma omp parallel for
	for (int y = 0; y &lt; height; y++) {
		greyBuf[y] = new uchar[width + k.width - 1];
		memcpy(greyBuf[y], grey[y], width);
	}

	/*
	 * apply kernel on pixmap
	 * give a special treatment for the border
	**/
	// border-top
	int x;
	#pragma omp parallel for private(x)
	for (int y = 0; y &lt; (k.width / 2); y++) {
		for (x = 0; x &lt; width; x++) {
			grey[y][x] = falten(x, y, k, greyBuf);
		}
	}
	[...]
	#pragma omp parallel for
	for (int i = 0; i &lt; height; i++)
		delete [] greyBuf[i];
	[...]
</code></pre>
<p>Nun habe ich aber einige Probleme bei der Parallelisierung eines Histogramms:</p>
<pre><code class="language-cpp">[...]
	#pragma omp parallel for private(x)
	for (int y = 0; y &lt; height; y++) {
		for (x = 0; x &lt; width; x++) {
			#pragma omp atomic
			histoRed[red[y][x&rsqb;&rsqb;++;
			#pragma omp atomic
			histoGreen[green[y][x&rsqb;&rsqb;++;
			#pragma omp atomic
			histoBlue[blue[y][x&rsqb;&rsqb;++;
		}
	}
	[...]
</code></pre>
<p>So ist das ganze allerdings wesentlich langsamer als die nich nicht parallelisierte Version. Eigentlich müsste ja aber nur der Zugriff auf die Einzelnen Arrayelement synchronisiert werden. Auf verschiedene Elemente eines Arrays darf ja parallel zugegriffen werden. Jedoch ist mir bisher kein Weg eingefallen, wie man das realisieren könnte. Ich hoffe, es hat jmd. ein wenig mehr Ahnung von OpenMP und kann mir ein paar Tipps geben.</p>
<p>Gruß Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/233153/parallelisierung-mit-openmp</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 02:17:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/233153.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 01 Feb 2009 14:26:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parallelisierung mit OpenMP on Sun, 01 Feb 2009 14:26:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin gerade dabei ein paar Funktionen mittels OpenMP zu parallelisieren. Bei einigen habe ich an sich keine großen Probleme, wie bspw.:</p>
<pre><code class="language-cpp">[...]
	omp_set_num_threads(4);
	#pragma omp parallel for
	for (int y = 0; y &lt; height; y++) {
		greyBuf[y] = new uchar[width + k.width - 1];
		memcpy(greyBuf[y], grey[y], width);
	}

	/*
	 * apply kernel on pixmap
	 * give a special treatment for the border
	**/
	// border-top
	int x;
	#pragma omp parallel for private(x)
	for (int y = 0; y &lt; (k.width / 2); y++) {
		for (x = 0; x &lt; width; x++) {
			grey[y][x] = falten(x, y, k, greyBuf);
		}
	}
	[...]
	#pragma omp parallel for
	for (int i = 0; i &lt; height; i++)
		delete [] greyBuf[i];
	[...]
</code></pre>
<p>Nun habe ich aber einige Probleme bei der Parallelisierung eines Histogramms:</p>
<pre><code class="language-cpp">[...]
	#pragma omp parallel for private(x)
	for (int y = 0; y &lt; height; y++) {
		for (x = 0; x &lt; width; x++) {
			#pragma omp atomic
			histoRed[red[y][x&rsqb;&rsqb;++;
			#pragma omp atomic
			histoGreen[green[y][x&rsqb;&rsqb;++;
			#pragma omp atomic
			histoBlue[blue[y][x&rsqb;&rsqb;++;
		}
	}
	[...]
</code></pre>
<p>So ist das ganze allerdings wesentlich langsamer als die nich nicht parallelisierte Version. Eigentlich müsste ja aber nur der Zugriff auf die Einzelnen Arrayelement synchronisiert werden. Auf verschiedene Elemente eines Arrays darf ja parallel zugegriffen werden. Jedoch ist mir bisher kein Weg eingefallen, wie man das realisieren könnte. Ich hoffe, es hat jmd. ein wenig mehr Ahnung von OpenMP und kann mir ein paar Tipps geben.</p>
<p>Gruß Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655967</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Sun, 01 Feb 2009 14:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Parallelisierung mit OpenMP on Sun, 01 Feb 2009 14:51:09 GMT]]></title><description><![CDATA[<p>der code ist nicht vernuenftig parallelisierbar so.</p>
<p><div class="plugin-markdown"><input type="checkbox" id="checkbox6079" checked="true" /><label for="checkbox6079">zugreifen zu koennen muss erstmal ein lock geholt werden (dazu muss ueberprueft werden ob es bereits eins gibt) dann geschrieben und dannd as lock wieder freigegeben.</label></div></p>
<p>uU macht openMP das ohne dediziertes lock und ueber CAS - so genau kenne ich die implementierung nicht. Das problem dabei bleibt aber bestehen: locking kostet zeit. Und jede operation in deiner schleife muss gelockt werden.<br />
was uU etwas bringen koennte waere 3 schleife zu machen die parallel laufen und jeweils nur red, green oder blue setzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1655983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1655983</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 01 Feb 2009 14:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to Parallelisierung mit OpenMP on Mon, 02 Feb 2009 14:47:13 GMT]]></title><description><![CDATA[<p>Nur nochmal hier meine Lösung. Ich habe das ganze letztendlich wirklich in drei Blöcke zerlegt:</p>
<pre><code class="language-cpp">omp_set_num_threads(3);
	#pragma omp parallel
	{
		#pragma omp single nowait
		{
			int histoRed[256]   = {0};
			for (int y = 0; y &lt; height; y++) {
				for (int x = 0; x &lt; width; x++) {
					histoRed[red[y][x&rsqb;&rsqb;++;
				}
			}
			ofstream outRed(&quot;parallel_red_histogramm.dat&quot;, ofstream::out);
			for (int i = 0; i &lt; 256; i++)
				outRed   &lt;&lt; i &lt;&lt; ' ' &lt;&lt; histoRed[i]   &lt;&lt; endl;
			outRed.close();
		}
		#pragma omp single nowait
		{
			// same for green
		}
		#pragma omp single nowait
		{
			// and for blue
		}
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1656576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1656576</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Mon, 02 Feb 2009 14:47:13 GMT</pubDate></item></channel></rss>