C'è un modo per aggiornare un massimo da più thread utilizzando le operazioni atomiche?Aggiornamento di un valore massimo da più thread
esempio illustrativo:
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);
}
Nel caso precedente, la sezione critica sincronizza accesso all'intera vettore, che abbiamo solo bisogno di sincronizzare l'accesso a ciascuno dei valori indipendentemente.
non è possibile utilizzare il nuovo 'std :: atomic'? –
Nim
OpenMP fornisce il proprio set di funzioni di blocco a grana fine nella famiglia 'omp _ * _ lock()'.Ma la vera domanda è: hai davvero bisogno di un blocco a grana fine? L'intero vettore 'coord_max' si estende su 8 linee di cache su x86/x64 e come' get_coord() 'restituisce valori sparsi nell'intero spettro, c'è una grande possibilità che si verifichino false condivisioni su ogni negozio - questo potrebbe essere più dannoso per il velocità di esecuzione rispetto alla sezione di codice sincronizzato. –
@Nim - è 'std :: atomic' lock-free? Sospetto che non lo sia. –