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!
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
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
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