<?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[Open MPI - Schleife parallelisieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte in meinem Programm Schleifen parallelisieren und dafür OpenMPI nutzen. Das tatsächliche Programm ist wesentlich komplexer, aber ich habe hier mal ein einfaches, leider nicht funktionierende (wird nur seriell ausgeführt) Beispiel erstellt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;time.h&gt;
#include &lt;omp.h&gt;
#define N 1e6

using namespace std;

class DoSomething{
public:
	static int DoParallel(){
		unsigned long i = 0, j = 0, k = 0;
#pragma omp parallel nowait num_threads(3) for
		for (i = 0; i &lt; 1000; i++){
			for (j = 0; j &lt; N; j++){
				k++;
			}
			for (j = 0; j &lt; N; j++){
				k--;
			}
		}
		cout &lt;&lt; &quot;k: &quot; &lt;&lt; k &lt;&lt; endl;
		return 0;
	}
};

int main(){
	time_t start = time(NULL), stop;
	cout &lt;&lt; &quot;Go!&quot;&lt;&lt; endl;

	DoSomething::DoParallel();

	cout &lt;&lt; &quot;Required wall clock time: &quot; &lt;&lt; difftime(stop = time(NULL), start) &lt;&lt; &quot; sec.&quot; &lt;&lt; endl &lt;&lt; endl;	
	getchar();
	return 0;
}
</code></pre>
<p>Also, das Programm wird ausgeführt, der Rechner benötigt etwa 4 Sekunden... aber die CPU Leistung bleibt bei meinem Vierkerner bei 25% statt erwartete 75%.<br />
Kann es daran liegen, dass ich die Variablen nicht als share, firstprivate, private, lastprivate definiert habe - aber das sollte nicht nötig sein?<br />
Sieht jemand den Fehler?</p>
<p>Ps.: Auch wenn ich die parallele Schleife in folgenden Ausdruck packe, funktioniert es nicht:</p>
<pre><code>#pragma omp parallel
		{

}
</code></pre>
<p>Vielen Dank für Eure Mühe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324572/open-mpi-schleife-parallelisieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 04:25:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324572.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Mar 2014 21:15:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 21:16:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte in meinem Programm Schleifen parallelisieren und dafür OpenMPI nutzen. Das tatsächliche Programm ist wesentlich komplexer, aber ich habe hier mal ein einfaches, leider nicht funktionierende (wird nur seriell ausgeführt) Beispiel erstellt:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;time.h&gt;
#include &lt;omp.h&gt;
#define N 1e6

using namespace std;

class DoSomething{
public:
	static int DoParallel(){
		unsigned long i = 0, j = 0, k = 0;
#pragma omp parallel nowait num_threads(3) for
		for (i = 0; i &lt; 1000; i++){
			for (j = 0; j &lt; N; j++){
				k++;
			}
			for (j = 0; j &lt; N; j++){
				k--;
			}
		}
		cout &lt;&lt; &quot;k: &quot; &lt;&lt; k &lt;&lt; endl;
		return 0;
	}
};

int main(){
	time_t start = time(NULL), stop;
	cout &lt;&lt; &quot;Go!&quot;&lt;&lt; endl;

	DoSomething::DoParallel();

	cout &lt;&lt; &quot;Required wall clock time: &quot; &lt;&lt; difftime(stop = time(NULL), start) &lt;&lt; &quot; sec.&quot; &lt;&lt; endl &lt;&lt; endl;	
	getchar();
	return 0;
}
</code></pre>
<p>Also, das Programm wird ausgeführt, der Rechner benötigt etwa 4 Sekunden... aber die CPU Leistung bleibt bei meinem Vierkerner bei 25% statt erwartete 75%.<br />
Kann es daran liegen, dass ich die Variablen nicht als share, firstprivate, private, lastprivate definiert habe - aber das sollte nicht nötig sein?<br />
Sieht jemand den Fehler?</p>
<p>Ps.: Auch wenn ich die parallele Schleife in folgenden Ausdruck packe, funktioniert es nicht:</p>
<pre><code>#pragma omp parallel
		{

}
</code></pre>
<p>Vielen Dank für Eure Mühe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390440</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sat, 22 Mar 2014 21:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 21:32:11 GMT]]></title><description><![CDATA[<p>In deiner Schleife wird eine einzige Variable manipuliert. Da kann nicht nur OMP nichts, da kann niemand etwas parallelisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390443</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 22 Mar 2014 21:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 21:41:15 GMT]]></title><description><![CDATA[<p>Wieso hat das damit etwas zutun? In meinem Programm wird eine Liste durchlaufen. 2 Mio. Elemente und für jedes Element soll ein komplexer Berechnungsprozess durchgeführt werden. Den wollte ich einfach durch das in- und decrementieren von k simulieren.</p>
<p>Das Programm macht natürlich keinen Sinn... Es soll einfach 1000 mal, bzw.<br />
3 * 333 mal ein lokaler wert k rauf und runter gezählt werden. Im korrigierten Beispiel ist die Variable k jetzt lokal - aber es läuft trotzdem nur seriel.</p>
<pre><code>class DoSomething{
public:
	static int DoParallel(){
		unsigned long i = 0;

#pragma omp parallel for nowait num_threads(3) 
			for (i = 0; i &lt; 1000; i++){
				Process();
			}
			return 0;
		}

private:
	static int Process(){
		unsigned long j = 0, k = 0;

		for (j = 0; j &lt; N; j++){
			k++;
		}
		for (j = 0; j &lt; N; j++){
			k--;
		}
		return 0;
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2390447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390447</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sat, 22 Mar 2014 21:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 21:45:11 GMT]]></title><description><![CDATA[<p>...zusammen hängt, wenn vier Threads eine Variable bearbeiten - gleichzeitig.<br />
Aber im korrigierten Beispiel sind die Variablen lokal für jeden Thread anders... und es läuft noch immer nur seriel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390448</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sat, 22 Mar 2014 21:45:11 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 22:05:34 GMT]]></title><description><![CDATA[<p>Disclaimer: Ich stecke jetzt in OMP nicht wirklich drin.</p>
<p>Unter Windows sagt mir der Task-Manager (unter Linux gibt's garantiert 'n Äquivalent) wieviele Threads ein Prozess am Laufen hat. Schau doch mal da.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390451</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 22 Mar 2014 22:05:34 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 22:07:34 GMT]]></title><description><![CDATA[<p>Der zeigt 25% an - also seriel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390453</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sat, 22 Mar 2014 22:07:34 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 22:11:26 GMT]]></title><description><![CDATA[<p>Das sagt nichts über die Anzahl der laufenden Threads aus!<br />
~Du magst recht haben, aber bis jetzt glaubst Du es nur. Warum willst Du dich nicht vergewissern?~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390455</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 22 Mar 2014 22:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 22:24:24 GMT]]></title><description><![CDATA[<pre><code>class DoSomething{
public:
	static int DoParallel(){
		int i = 0, j = 0;
#pragma omp parallel
		{
#pragma omp parallel for nowait num_threads(3) 
			for (i = 0; i &lt; 1000; i++){
				cout &lt;&lt; &quot;Process done by thread number &quot; &lt;&lt; omp_get_thread_num() &lt;&lt; endl; //Output of thread number
				Process();
			}
		}
			return 0;
		}

private:
	static int Process(){
		int j = 0, k = 0;

		for (j = 0; j &lt; N; j++){
			k++;
		}
		for (j = 0; j &lt; N; j++){
			k--;
		}
		return 0;
	}
};
</code></pre>
<p>Das Programm gibt nur &quot;Process done by thread number 0&quot; aus.</p>
<p>Und wenn Du vier Kerne hast, und bei diesem Programm nur einer arbeitet, dann zeigt der TM 25% an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390458</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sat, 22 Mar 2014 22:24:24 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sat, 22 Mar 2014 22:35:29 GMT]]></title><description><![CDATA[<p>Ohje, hab gerade auf Wikipedia über OpenMPI folgendes gelesen:</p>
<p>&quot;OpenMP ist in den meisten Compilern integriert.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Microsoft Visual C++ 2005, 2008 und 2010 (Professional, Team System, Premium und Ultimate Edition) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> ,<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Intel Parallel Studio für verschiedene Prozessoren (OpenMP 3.1 seit Version 13),<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> GCC seit Version 4.2 (OpenMP 3.1 seit Version 4.7),<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Oracle Solaris Studio Compiler und Tools für Solaris OS (UltraSPARC und x86/x64) und Linux,<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Fortran, C und C++ Compiler der Portland Group (OpenMP 2.5),<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> IBM XL C/C++ compiler,<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> Nanos Compiler<br />
&quot;</p>
<p>Ich hab nur die kostenlose Express Version.</p>
<p>Kann das jemand so bestätigen, denn Wikipedia muss nicht immer recht haben und mein Kompiler gibt keinen Fehler aus. Die OMP.h-header war standardmäßig verfügbar über #include &lt;omp.h&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390459</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sat, 22 Mar 2014 22:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to Open MPI - Schleife parallelisieren on Sun, 23 Mar 2014 00:09:51 GMT]]></title><description><![CDATA[<p>/openmp muss in die Kompiler-Befehlszeile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390467</guid><dc:creator><![CDATA[CJens]]></dc:creator><pubDate>Sun, 23 Mar 2014 00:09:51 GMT</pubDate></item></channel></rss>