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.

Sie könnte 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

Schreibe einen Kommentar