2017-11-20 3 views
0

I einen OpenMP Code, die OpenMP ungleiche Last ohne Schleife

while(counter < MAX) { 
    #pragma omp parallel reduction(+:counter) 
    { 
    // do monte carlo stuff 
    // if a certain condition is met, counter is incremented 

    } 
} 

daher wie folgen

sieht, ist die Idee, dass der parallele Abschnitt durch die verfügbaren Threads ausgeführt wird, solange der Zähler unter einem gewissen ist Wert. Abhängig vom Szenario (ich mache MC-Sachen hier, also ist es zufällig), könnten die Berechnungen länger dauern als andere, so dass es hier ein Ungleichgewicht zwischen den Arbeitern gibt, was sich aufgrund der impliziten Barriere am Ende der Parallele zeigt Sektion.

Es scheint, als hätte #pragma omp parallel für Möglichkeiten, dies zu umgehen (d. H. Nowait Direktive/dynamische Planung), aber ich kann dies nicht verwenden, da ich keine obere Iterationsnummer für die for-Schleife kenne.

Irgendwelche Ideen/Entwurfsmuster, wie man mit solch einer Situation umgeht?

Mit freundlichen Grüßen!

Antwort

0

Führen Sie alles in einem einzigen parallelen Abschnitt und greifen Sie auf die counter atomar.

int counter = 0; 
#pragma omp parallel 
while(1) { 
    int local_counter; 
    #pragma omp atomic read 
    local_counter = counter; 
    if (local_counter >= MAX) { 
      break; 
    } 
    // do monte carlo stuff 
    // if a certain condition is met, counter is incremented 
    if (certain_condition) { 
     #pragma omp atomic update 
     counter++; 
    } 
} 

Sie können nicht direkt in der while-Bedingung, wegen der atomaren Zugriff überprüfen. Beachten Sie, dass dieser Code überschwingt, d. H. counter > MAX ist nach dem parallelen Abschnitt möglich. Denken Sie daran, dass counter freigegeben ist und von vielen Threads gelesen/aktualisiert wird.

+0

Danke dir - ich werde es sofort ausprobieren. Ich denke, die Kürzungsklausel wird dann nicht mehr benötigt, oder? Ich meine, mit den atomaren Operationen kümmert sich der Code schon darum, oder? – tomseidel1

+0

Ja die Reduktionsklausel ist in diesem Fall falsch - Entschuldigung und guten Fang. Atomics wird darauf achten, dass 1) 'counter' die korrekte Anzahl an Gesamtzeiten aktualisiert und 2) Sie immer einen gültigen Wert lesen. – Zulan

+0

Eine weitere allgemeine Frage: Was ist der beste Weg, um eine Situation zu behandeln, in der die Threads auf eine komplizierte Struktur zugreifen müssen (damit meine ich zum Beispiel Mitglieder, die dynamisch zugewiesene Arrays sind) in readonly Weise? Mein derzeitiger Ansatz wurde einfach geteilt und ich habe keine Probleme bemerkt. Allerdings frage ich mich: Warum müsste ich dann das #pragma atomare lesen? Wäre firstprivate geeigneter für die Struktur? – tomseidel1

Verwandte Themen