OpenMP: Get Gesamt Anzahl der Laufenden threads
Ich brauche, um zu wissen, die Gesamtzahl der threads, dass mein Antrag hervorgebracht hat, die über OpenMP. Leider, die omp_get_num_threads()
- Funktion funktioniert nicht arbeiten hier, da es nur liefert die Anzahl der threads im aktuellen team.
Aber mein code läuft rekursiv (divide and conquer, im Grunde) und ich möchte, um zu laichen neue threads, solange es noch Prozessoren im Leerlauf, aber nicht mehr.
Gibt es einen Weg, um die Grenzen der omp_get_num_threads
und Holen Sie sich die insgesamt Anzahl der Laufenden threads?
Wenn mehr detail ist erforderlich, beachten Sie die folgenden pseudo-code, die Modelle meinen workflow ziemlich eng:
function divide_and_conquer(Job job, int total_num_threads):
if job.is_leaf(): # Recurrence base case.
job.process()
return
left, right = job.divide()
current_num_threads = omp_get_num_threads()
if current_num_threads < total_num_threads: # (1)
#pragma omp parallel num_threads(2)
#pragma omp section
divide_and_conquer(left, total_num_threads)
#pragma omp section
divide_and_conquer(right, total_num_threads)
else:
divide_and_conquer(left, total_num_threads)
divide_and_conquer(right, total_num_threads)
job = merge(left, right)
Wenn ich rufe diesen code mit einem total_num_threads
Wert von 4, die die bedingten kommentiert mit (1)
wird immer bewerten zu true
(da jeder thread-team enthalten höchstens zwei threads) und somit wird der code immer spawnen zwei neue threads, egal, wie viele threads laufen bereits auf eine höhere Ebene.
Ich bin auf der Suche nach einem Plattform-unabhängige Art und Weise der Ermittlung der Gesamtzahl der threads, die momentan laufen in meiner Anwendung.
OMP_THREAD_LIMIT
environment-Variablen zu begrenzen, die maximale Anzahl der OpenMP threads zur Verfügung, um ein Programm.Sebastian: wenn man die definition einer Funktion ist, ich denke OP will eine dynamische Grenze, die nicht zur Verfügung gestellt werden, die durch die Umgebungsvariable.
Ich habe das kommentiert, das " ich möchte, um zu laichen neue threads, solange es noch Prozessoren im Leerlauf, aber nicht mehr.' Teil. Die Anzahl der CPUs ist nicht sehr dynamisch und die environment-variable tun wird.
InformationsquelleAutor Konrad Rudolph | 2011-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie daran, Sie wissen, die genaue Menge der threads, die erstellt wird, ist die einfachste Lösung, die ich kommen mit ist, halten Sie Ihre eigenen-thread-Zähler.
Bewusst sein, ich bin völlig im dunklen über die OpenMP-wie ich habe nie wirklich verwendet.
InformationsquelleAutor jweyrich
Ich denke, es ist keine routine, die in mindestens OpenMP 3; und wenn es war, ich bin nicht sicher, es würde helfen, da gibt es offensichtlich eine große race-Bedingung zwischen das zählen der Anzahl von threads und forking. Sie könnten am Ende überschwingen Ihre Ziel Anzahl der threads, die von fast einem Faktor 2, wenn jeder sieht, dass es gibt Raum für ein Gewinde Links und dann jeder erstellt einen thread.
Wenn das wirklich so ist die Struktur des Programms, obwohl, und Sie wollen einfach nur begrenzen Sie die Gesamtzahl der threads, dort sind die Optionen (alle diese sind OpenMP 3.0):
OMP_THREAD_LIMIT
environment-variable begrenzen Sie die Gesamtzahl der OpenMP-threadsOMP_MAX_ACTIVE_LEVELS
oderomp_set_max_active_levels()
oder test gegenomp_get_level()
zu beschränken, wie tief verschachtelten threads deine sind; - wenn Sie möchten, dass nur 16 threads, die Begrenzung auf 4 Ebenen verschachtelnomp_get_level()
zu finden, Ihr Niveau, und nennenomp_get_ancestor_thread_num(int level)
auf verschiedenen Ebenen zu finden, von welchem thread wurde Sie Ihre Eltern, Großeltern, etc. und von diesem (mit Hilfe dieses einfachen Links-rechts-Verzweigung) bestimmen Sie eine Globale thread-ID. (Ich denke, in diesem Fall es würde so etwas ∑l=0..L-1l 2L-l, wo l ist die Nummer der Ebene, beginnend bei 0 und ist der Stammvater thread-Anzahl, die auf dieser Ebene). Damit würden Sie (sagen) ermöglichen threads 0-3 Gabel aber nicht, 4-7, so dass Sie würde am Ende mit 12 statt 16 threads. Ich denke, das funktioniert nur in so regelmäßiger situation, wenn beide Eltern Gewinde Gabel eine unterschiedliche Anzahl von Kind-threads, ich glaube nicht, dass Sie bestimmen, eine einzigartige Globale thread-ID, weil es aussieht wie können Sie nur die Abfragen Ihrer direkten Vorfahren.Fair genug; manchmal gibt es andere Einschränkungen, die Sie in Arbeit haben.
dein Vorschlag (3) sieht tatsächlich unglaublich gut. Unfortuntely, ich habe auch zu unterstützen OpenMP 2.5. 🙁
InformationsquelleAutor Jonathan Dursi
Den code, den Sie gezeigt haben, hat das problem, dass ein "omp section" innerhalb der lexikalischen Rahmen einer "omp sections". Ich gehe davon aus, dass du meintest die "omp parallel" zu einer "omp parallel sections". Der andere Weg, dies zu tun, ist die Verwendung von "omp task" und dann müssen Sie nicht haben, um halten Sie die Anzahl der threads. Würden Sie geben Sie einfach die Fäden der parallel-region und ermöglichen die OpenMP-Implementierung zuordnen der Aufgaben auf die threads.
sections
pragma.InformationsquelleAutor ejd