<?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[Problem bei Paralellisierung]]></title><description><![CDATA[<p>Ich habe einen Bereich im Code der parallelisiert werden soll.<br />
Allerdings ist eine Stelle nicht gescheit parallelisierbar, da der errechnete Wert vom aktuellen Durchgang abhängig ist.</p>
<pre><code class="language-cpp">m_fSigmaT = m_DistFunction-&gt;decay(m_fSigma0, m_iCycle, m_fLambda);
</code></pre>
<p>Nun frage ich mich, ob es möglich ist, dieses problem irgendwie mit hilfe von openMP zu umgehen.<br />
Oder ist dieses Beispiel eines der Probleme, die man nicht parallelisieren kann, ohne Genauigkeit einzubüßen?</p>
<pre><code class="language-cpp">#pragma omp for
	for(int i = 0; i &lt; static_cast&lt;int&gt;(m_iCycles); i++) {
		m_iCycle = i;
		std::cout&lt;&lt;&quot;Cycle: &quot;&lt;&lt;m_iCycle&lt;&lt;std::endl;

	    // The input vectors are presented to the network at random
		iChoice = RandInt(iMin, iMax);
	    SetInput( GetTrainingSet()-&gt;GetInput(iChoice) );

		// Present the input vector to each node and determine the BMU
		FindBMNeuron();

		// Calculate the width of the neighborhood for this time step
		m_fSigmaT = m_DistFunction-&gt;decay(m_fSigma0, m_iCycle, m_fLambda);

		// Adjust the weight vector of the BMU and its neighbors
		PropagateBW();
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/300706/problem-bei-paralellisierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 16:11:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/300706.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Mar 2012 18:22:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei Paralellisierung on Thu, 08 Mar 2012 18:22:12 GMT]]></title><description><![CDATA[<p>Ich habe einen Bereich im Code der parallelisiert werden soll.<br />
Allerdings ist eine Stelle nicht gescheit parallelisierbar, da der errechnete Wert vom aktuellen Durchgang abhängig ist.</p>
<pre><code class="language-cpp">m_fSigmaT = m_DistFunction-&gt;decay(m_fSigma0, m_iCycle, m_fLambda);
</code></pre>
<p>Nun frage ich mich, ob es möglich ist, dieses problem irgendwie mit hilfe von openMP zu umgehen.<br />
Oder ist dieses Beispiel eines der Probleme, die man nicht parallelisieren kann, ohne Genauigkeit einzubüßen?</p>
<pre><code class="language-cpp">#pragma omp for
	for(int i = 0; i &lt; static_cast&lt;int&gt;(m_iCycles); i++) {
		m_iCycle = i;
		std::cout&lt;&lt;&quot;Cycle: &quot;&lt;&lt;m_iCycle&lt;&lt;std::endl;

	    // The input vectors are presented to the network at random
		iChoice = RandInt(iMin, iMax);
	    SetInput( GetTrainingSet()-&gt;GetInput(iChoice) );

		// Present the input vector to each node and determine the BMU
		FindBMNeuron();

		// Calculate the width of the neighborhood for this time step
		m_fSigmaT = m_DistFunction-&gt;decay(m_fSigma0, m_iCycle, m_fLambda);

		// Adjust the weight vector of the BMU and its neighbors
		PropagateBW();
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2189888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189888</guid><dc:creator><![CDATA[dgrat__]]></dc:creator><pubDate>Thu, 08 Mar 2012 18:22:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Thu, 08 Mar 2012 18:45:17 GMT]]></title><description><![CDATA[<p>Wenn ich das recht sehen, hängt doch nichts von den vorherigen Durchgängen ab. Wo ist das Problem?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189893</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 08 Mar 2012 18:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Thu, 08 Mar 2012 19:09:23 GMT]]></title><description><![CDATA[<p>Wenn ich den kram mit openmp ausführe, dann laufen alle threads mit unterschiedlicher indexnummer ab.<br />
das führt dann dazu, dass werte abwechselnd hintereinander mit total unterschiedlicher stärke trainiert werden.<br />
das sollte vermieden werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189902</guid><dc:creator><![CDATA[dgrat__]]></dc:creator><pubDate>Thu, 08 Mar 2012 19:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Thu, 08 Mar 2012 19:22:42 GMT]]></title><description><![CDATA[<p>Dann ist mir deine Problemstellung unklar. Versuch mal ein kurzes, vollständiges(!) Programm zu basteln, an dem dein Fehler zu sehen ist. Sag dazu auch noch, was genau du erwartest (am besten eine konkrete Ausgabe, die kommen soll) und was stattdessen passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189908</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 08 Mar 2012 19:22:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Thu, 08 Mar 2012 20:15:33 GMT]]></title><description><![CDATA[<p>Hmm, irgendwie scheint das Problem doch eher in einer Unterfunktion zu liegen.<br />
Aber ich versuche das ganze mal so gut wie möglich darzulegen.<br />
Ich habe eine selbstorganisierende Karte die Trainiert wird, durch die Funktion:</p>
<pre><code class="language-cpp">void SOMNet::Training(const unsigned int &amp;iCycles) {
	m_iCycles = iCycles;
	int iChoice = 0;
	int iMin 	= 0;
	int iMax 	= GetTrainingSet()-&gt;GetNrElements()-1;

	// find sigma0
	assert(iCycles &gt; 0);
	assert(m_fSigma0 &gt; 0.f);
	m_fLambda = m_iCycles / log(m_fSigma0);

	for(int i = 0; i &lt; static_cast&lt;int&gt;(m_iCycles); i++) {
		m_iCycle = i;
		std::cout&lt;&lt;&quot;Cycle: &quot;&lt;&lt;m_iCycle&lt;&lt;std::endl;

	    // The input vectors are presented to the network at random
		iChoice = RandInt(iMin, iMax);
	    SetInput( GetTrainingSet()-&gt;GetInput(iChoice) );

		// Present the input vector to each node and determine the BMU
		FindBMNeuron();

		// Calculate the width of the neighborhood for this time step
		m_fSigmaT = m_DistFunction-&gt;decay(m_fSigma0, m_iCycle, m_fLambda);

		// Adjust the weight vector of the BMU and its neighbors
		PropagateBW();
	}
}
</code></pre>
<p>Dann habe ich eine Unterfunktion bei der der Hauptrechenaufwand liegt:</p>
<pre><code class="language-cpp">//#pragma omp parallel for
	for(int i = 0; i &lt; static_cast&lt;int&gt;(m_pOPLayer-&gt;GetNeurons().size() ); i++) {
		pNeuron = (SOMNeuron*)m_pOPLayer-&gt;GetNeuron(i);
		fDist = pNeuron-&gt;GetDistance2Neur(*m_pBMNeuron);

		if(fDist &lt; m_fSigmaT) {
			//calculate by how much weights get adjusted ..
			fInfluence = m_DistFunction-&gt;distance(fDist, m_fSigmaT);
			pNeuron-&gt;SetInfluence(fInfluence);

			// .. and adjust them
			pNeuron-&gt;AdaptEdges();
		}

	    //reduce the learning rate
		fLearningRate = m_DistFunction-&gt;decay(m_fLearningRate, m_iCycle, m_iCycles);
		pNeuron-&gt;SetLearningRate(fLearningRate);
	}
</code></pre>
<pre><code class="language-cpp">void SOMNeuron::AdaptEdges() {
	Edge 	*pEdge 	= NULL;
	float 	fInput 	= 0.f;
	float 	fWeight = 0.f;

    for(unsigned int i = 0; i &lt; GetConsI().size(); i++) {
    	pEdge 	= GetConI(i);
    	fWeight = *pEdge;
    	fInput 	= *pEdge-&gt;GetDestination(this);

    	pEdge-&gt;SetValue(fWeight + (m_fInfluence*m_fLearningRate*(fInput-fWeight) ) );
    }
}
</code></pre>
<p>Wenn ich das Netz regulär auf ein paar Farben trainiere, dann sieht das Ergebnis richtig aus, da alle Farben bestimmten und abgegrenzten Bereichen zugeordnet werden:<br />
<a href="http://s14.directupload.net/images/120308/8r92wjkw.png" rel="nofollow">http://s14.directupload.net/images/120308/8r92wjkw.png</a><br />
Wenn ich jetzt OpenMP benutze, dann sieht das ganze fast immer so aus:<br />
<a href="http://s1.directupload.net/images/120308/gtuomo4j.png" rel="nofollow">http://s1.directupload.net/images/120308/gtuomo4j.png</a><br />
Ehrlich gesagt bin ich mir jetzt auch nicht mehr sicher woran es liegt.<br />
Wenn ich die Lernrate konstant setze, bekomme ich die gleichen Resultate in beiden Fällen,<br />
sodass es an etwas anderen liegen muss. Ich weis jetzt auch nicht wo das Problem liegt, aber die Ausgabebilder demonstrieren, dass es eins gibt, wenn ich OpenMP benutze.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189927</guid><dc:creator><![CDATA[dgrat__]]></dc:creator><pubDate>Thu, 08 Mar 2012 20:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Thu, 08 Mar 2012 20:34:16 GMT]]></title><description><![CDATA[<p>Nur um mal ganz dumme Fehler auszuschließen: Du arbeitest da ja immer auf den gleichen Objekten (m_pOPLayer, m_DistFunction). Sind die auch richtig an die Threads verteilt (private, shared)? Falls sie shared sind, sind die benutzten Methoden auch threadsicher? Falls die Methoden Änderungen vornehmen, ist deren Reihenfolge auch egal?</p>
<p>P.S.: Und tut die ungarische Notation Not? Das ist in C++ ziemlich unsinnig, da man es sowieso nicht konsequent durchhalten kann ohne verrückt zu werden und macht alles bloß total unleserlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2189933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2189933</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 08 Mar 2012 20:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Fri, 09 Mar 2012 09:00:14 GMT]]></title><description><![CDATA[<p>Die Notation habe ich in allen Klassen bisher durchgehalten und das sind weit mehr als für diese eine SOM.<br />
Zur eigentlichen Thematik. Die Objekte müssten alle shared sein (Membervariablen) und die Funktionen theoretische alle parallel ausführbar.<br />
höchstens bei der m_DistFunction-&gt;decay() Funktion vermute ich Probleme, weil ich die irgendwo in ein Objekt eingebettet hatte und diese als inline static deklariert ist. Das Obejkt, was halt auch noch andere Funktionen enthalten kann liegt dann in der Klasse für das Netz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190025</guid><dc:creator><![CDATA[dgrat__]]></dc:creator><pubDate>Fri, 09 Mar 2012 09:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Fri, 09 Mar 2012 09:22:05 GMT]]></title><description><![CDATA[<p>Was heißt hier, du vermutest da irgendwie irgendwelche Probleme? Du musst doch wissen (nicht vermuten), ob die Sachen threadsicher sind oder nicht, wenn du sie so benutzt! Da wundert mich gar nicht, dass es nicht funktioniert, wenn du dir darüber keine Gedanken gemacht hast. Insbesondere, da du beim Versuch ein Minimalbeispiel zu erstellen ja anscheinend festgestellt hast, dass es nicht an den Indizes, sondern an dieser Funktion liegt (es wäre auch sehr kurios gewesen, wenn es die Indizes gewesen wären).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190029</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 09 Mar 2012 09:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Fri, 09 Mar 2012 17:59:56 GMT]]></title><description><![CDATA[<p>Wenn mich einer vor der Benutzung dieser #pragma-Anweisung gefragt hätte, ob die Methoden threadsicher wären, hätte ich wohl ja gesagt.<br />
Aber da ich in dem Beispiel das Gegenteil gezeigt habe, ist die Frage eigentlich überflüssig gewesen..<br />
Wenn ich den Fehler finde, poste ich ihn hier mal rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190218</guid><dc:creator><![CDATA[dgrat__]]></dc:creator><pubDate>Fri, 09 Mar 2012 17:59:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Paralellisierung on Fri, 09 Mar 2012 21:55:49 GMT]]></title><description><![CDATA[<p>ok, es reichte die variablen in der for schleife dort zu deklarieren, weil eine deklaration außerhalb zu doppelzugriffen führt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2190284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2190284</guid><dc:creator><![CDATA[dgrat__]]></dc:creator><pubDate>Fri, 09 Mar 2012 21:55:49 GMT</pubDate></item></channel></rss>