Есть ли способ обновить максимум из нескольких потоков с помощью атомных операций?Обновление максимального значения из нескольких потоков
Иллюстративный пример:
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);
}
В приведенном выше случае, критическая секция синхронизирует доступ ко всему вектору, тогда как нам нужно только для синхронизации доступа к каждому из значений, независимо друг от друга.
Вы не можете использовать новый 'std :: atomic'? –
Nim
OpenMP предоставляет собственный набор функций мелкозернистой блокировки в семействе 'omp _ * _ lock()'.Но реальный вопрос: вам действительно нужна мелкозернистая блокировка? Весь вектор 'coord_max' охватывает 8 строк кэша на x86/x64, а поскольку' get_coord() 'возвращает значения, разбросанные по всему спектру, существует большая вероятность того, что ложное совместное использование произойдет в каждом магазине - это может быть более вредным для чем синхронизированный код. –
@Nim - это 'std :: atomic' lock-free? Я подозреваю, что это не так. –