Schleife parallelisieren

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Schleife parallelisieren

Beitrag von MadMax »

Hi,

ich würde mein Programm geren auf Multicore architekturen optimieren. Zuerst dachte ich da an OpenMp als Lip. Allerdings bin ich gerade nicht mehr sicher ob das überhaupt geht.
Das Problem ist das ich einen Schleife habe deren länge erst zur Laufzeit bekannt ist. Die Frage ist nun ob und wie das mit OpneMp funktioniert. Alternativ wie kann ich den in C++ dynamisch einen neuen Thrad anlegen ?

Danke
Manuel
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von kimmi »

Sind die einzelnen Loopdurchläufe von dem jeweils vorherigen Durchlauf abhängig? Wenn nein : [1], wenn ja[2]. Die Datenabhängigkeiten machen das Parallelisieren so richtig knifflig. Manchmal muß man den jeweiligen Algorithmus noch etwas anpassen, um bei der Parallelisierung etwas ehrausholen zu können.

Und mit c++ Bordmitteln allein kannst du keinen Thread-Context anlegen. Dafür benötigst du betriebssystem-spezifische API-Calls. Die Boost.Thread Library ist da aber ziemlich gut und sehr zu empfehlen ( siehe [3] ).

Gruß Kimmi

[1] http://de.wikipedia.org/wiki/OpenMP
[2] http://rac.uits.iu.edu/hpc/openmp_tutorial/C/3.html
[3] http://www.boost.org/doc/libs/1_40_0/do ... hread.html
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von MadMax »

Hi,

danke dir erstmal. Die einzelnen Schleifenabläufe sind völlig unabhängig voneinander. Sie lesen allerdings die selben Daten. Und OpenMp kann auch mit dynamischen schleifen umgehen ? habe bisher nur beipiele mit statischen gefunden .
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von glassbear »

MadMax hat geschrieben:Hi,

danke dir erstmal. Die einzelnen Schleifenabläufe sind völlig unabhängig voneinander. Sie lesen allerdings die selben Daten. Und OpenMp kann auch mit dynamischen schleifen umgehen ? habe bisher nur beipiele mit statischen gefunden .
Ja, kann es, sonst wär es ja total nutzlos :?:
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von kimmi »

Einer der Gründe, dass die Compiler C/c++ nicht so gut optimieren können wie F77/F90 ist der, daß allein schon vom Syntax die Schleifen in C/C++ variabel in der Anzahl der Durchläufe sind. Von daher kommt das echt besser, wenn OpenMP damit umzugehen weiß. Das mußte ich aber auch erst probieren, um das wirklich zu verstehen.

Gruß Kimmi
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von MadMax »

Ok Danke für die Antworten. Ich habe es jetzt mal ausprobiert allerdigns mit mäßigem Erfolg. Entweder das Programm stürtz ab oder aber es wird nur ein Bruchteil der berechnungen durchgeführt.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von Aramis »

Main Ratschlag besteht darin, auf OpenMP zu verzichten und mit boost.threads manuell zu parallelisieren. Etwas mehr Arbeit, aber dafür beruht die Parallelisierung nicht auf ein paar Compiler-Hacks, nichts anderes sind #pragma's ...
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von kimmi »

Grundlegend stimme ich da Aramis zu. Man kann mittels OpenMP zwar nachträglich versuchen, Parallelisierung zu seiner Anwendung hinzuzufügen. Will man aber eine optimalere Lösung haben, kommt man um die manuelle Arbeit nur schwer herum.

Gruß Kimmi
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

Re: Schleife parallelisieren

Beitrag von Lord Delvin »

Aramis hat geschrieben:Main Ratschlag besteht darin, auf OpenMP zu verzichten und mit boost.threads manuell zu parallelisieren. Etwas mehr Arbeit, aber dafür beruht die Parallelisierung nicht auf ein paar Compiler-Hacks, nichts anderes sind #pragma's ...
Das Argument ist nicht wirklich gut und ehrlich gesagt kann ich dir auch nicht zustimmen, da parallelisierung mit threads natürlich bessere Ergebnisse liefert, allerdings nur wenn du genau weist, was du tust. Wenn nicht verbringst du sehr viel Zeit damit dir auf kryptische Weise in den Fuß zu schießen.
Das Problem löst OpenMP imo relativ gut. Nach eingehender Befassung mit dem Thema würde ich beides verwenden: Für gut parallisierbare Prozesse wie Ressourcenmanagement o.ä. würde ich Threads nehmen, für den hauptprozess OpenMP, weil du einfach nicht darüber nachdenken willst, wie du den weiter parallelisierst.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von glassbear »

MadMax hat geschrieben:Ok Danke für die Antworten. Ich habe es jetzt mal ausprobiert allerdigns mit mäßigem Erfolg. Entweder das Programm stürtz ab oder aber es wird nur ein Bruchteil der berechnungen durchgeführt.
Hast du vorher eine Analyse gemacht, dass die einzelnen Schleifendurchläufe auch wirklich unabhängig von einander sind? Auch Speicher-Allokationen, etc.?
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von MadMax »

Code: Alles auswählen

#pragma omp parallel for private(p,i)
for( i=0;i<5826;i++){
	p = this->app_scene->get_patch(i);
	if(!p->child[0]) {
		p->exitant_anti_radiant_intensity->clear(); 
		p->exitant_anti_radiant_intensity->transform_extAntiRad(p->incident_radiance);
		p->total_radiant_intensity->transform_totalRad(p->incident_radiance);}
}
Ich bin mir eigentlich sicher das keine Abhänigkeiten innerhabl der schleife vorhanden sind. Das ist jetzt das einfachste was ich ausprobiert habe. Die Schleife berechnet einfach die abgestrahlte Radiance für jeden Patch. die einfahllende Radiance leigt vor. Jeder Thread braucht also nur zugriff auf die werte von einem Patch. Wen ich die openMp zeile rausnehme funktioniert alles. Ist sie eingeschalltet bleibt eine gewisse Anzahl der Patches schwarz.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4260
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Schleife parallelisieren

Beitrag von Chromanoid »

Wenn ich das richtig verstehe müsstest du einfach einen threadpool benutzen können...
http://en.wikipedia.org/wiki/Thread_pool_pattern

Bau einfach ein thread-Objekt, was mit i_start und i_end parametrisiert wird (+readonly variablen falls die nicht global sind). Dann macht jeder Thread nur einen Teil der Schleife. Kannst ja dann rumprobieren welche Stückelung am effektivsten ist (je nach prozessoranzahl oder so...). Die Threads haust du dann einfach in den threadpool und fertig...

vielleicht ist das nützlich: http://threadpool.sourceforge.net/
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 577
Registriert: 05.07.2003, 11:17

Re: Schleife parallelisieren

Beitrag von Lord Delvin »

Sind die funktionen die du verwendest threadsafe? Also am besten als const T f(...) const deklariert?

Den Fehler den man am Anfang gerne macht ist anzunehmen, dass man nichts kaputt machen kann, wenn die Daten parallel sind. Die eigentliche Berechnung muss das auch sein.

Ich bin im übrigen grad über ompP gestolpert. War ziemlich schnell installiert, ist leicht zu bedienen und sieht ziemlich hilfreich aus:)

EDIT: Imo müsstest du in der omp Zeile auch eine Aussage über die Daten treffen die du von getpatch bekommst.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
MadMax
Beiträge: 59
Registriert: 24.01.2003, 13:31
Kontaktdaten:

Re: Schleife parallelisieren

Beitrag von MadMax »

Eigentlich sollte das ja ganz einfach sein jeder Prozesser bekommt pro schleifendurchlauf genau die daten von einem patch
Antworten