Gibt es eine Möglichkeit, ein Maximum aus mehreren Threads mit atomaren Operationen zu aktualisieren?Aktualisieren eines Maximalwerts aus mehreren Threads
erläuterndes Beispiel:
std::vector<float> coord_max(128);
#pragma omp parallel for
for (int i = 0; i < limit; ++i) {
int j = get_coord(i); // can return any value in range [0,128)
float x = compute_value(j, i);
#pragma omp critical (coord_max_update)
coord_max[j] = std::max(coord_max[j], x);
}
Im obigen Fall wird der kritische Abschnitt synchronisiert den Zugriff auf den gesamten Vektor, wohingegen wir nur unabhängig Zugriff auf jeden der Werte synchronisieren müssen.
können Sie die neue 'std :: atomic' nicht verwenden? –
Nim
OpenMP bietet eine eigene Reihe feinkörniger Sperrfunktionen in der Familie omp _ * _ lock() '.Aber die eigentliche Frage ist: Brauchen Sie wirklich eine feinkörnige Verriegelung? Der gesamte "coord_max" Vektor überspannt 8 Cache Zeilen auf x86/x64 und da 'get_coord()' Werte über das gesamte Spektrum verteilt zurück gibt, besteht die große Wahrscheinlichkeit, dass eine falsche Freigabe in jedem Speicher stattfinden würde - dies könnte für die Ausführungsgeschwindigkeit als der synchronisierte Codeabschnitt. –
@Nim - ist 'std :: atomic ' sperren-frei? Ich vermute es ist nicht. –