Schleife parallelisieren
Schleife parallelisieren
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
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
- kimmi
- Moderator
- Beiträge: 1412
- Registriert: 26.02.2009, 09:42
- Echter Name: Kim Kulling
- Wohnort: Luebeck
- Kontaktdaten:
Re: Schleife parallelisieren
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
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
Re: Schleife parallelisieren
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 .
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 .
-
- Establishment
- Beiträge: 324
- Registriert: 08.04.2003, 18:09
- Alter Benutzername: Enrico_
- Echter Name: Enrico
- Wohnort: San Diego
- Kontaktdaten:
Re: Schleife parallelisieren
Ja, kann es, sonst wär es ja total nutzlos :?: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 .
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!
- kimmi
- Moderator
- Beiträge: 1412
- Registriert: 26.02.2009, 09:42
- Echter Name: Kim Kulling
- Wohnort: Luebeck
- Kontaktdaten:
Re: Schleife parallelisieren
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
Gruß Kimmi
Re: Schleife parallelisieren
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.
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: Schleife parallelisieren
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 ...
- kimmi
- Moderator
- Beiträge: 1412
- Registriert: 26.02.2009, 09:42
- Echter Name: Kim Kulling
- Wohnort: Luebeck
- Kontaktdaten:
Re: Schleife parallelisieren
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
Gruß Kimmi
- Lord Delvin
- Establishment
- Beiträge: 598
- Registriert: 05.07.2003, 11:17
Re: Schleife parallelisieren
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.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 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.
-
- Establishment
- Beiträge: 324
- Registriert: 08.04.2003, 18:09
- Alter Benutzername: Enrico_
- Echter Name: Enrico
- Wohnort: San Diego
- Kontaktdaten:
Re: Schleife parallelisieren
Hast du vorher eine Analyse gemacht, dass die einzelnen Schleifendurchläufe auch wirklich unabhängig von einander sind? Auch Speicher-Allokationen, etc.?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.
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!
Re: Schleife parallelisieren
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);}
}
- Chromanoid
- Moderator
- Beiträge: 4285
- Registriert: 16.10.2002, 19:39
- Echter Name: Christian Kulenkampff
- Wohnort: Lüneburg
Re: Schleife parallelisieren
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/
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/
- Lord Delvin
- Establishment
- Beiträge: 598
- Registriert: 05.07.2003, 11:17
Re: Schleife parallelisieren
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.
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.
Re: Schleife parallelisieren
Eigentlich sollte das ja ganz einfach sein jeder Prozesser bekommt pro schleifendurchlauf genau die daten von einem patch