Сабж. Есть плюсовый код, цикл параллелится при помощи OpenMP. Цикл по вектору, в процессе работы используется таблица std::unordered_map<int, T>, sizeof(T)=16 байт, в таблицу идет как запись так и чтение (изначально таблица пустая).
Что бы исключить гонку данных каждый тред работает со своей таблицей.
Число итераций в цикле до 4млн, каждая итерация занимает порядка 20мкс.
Эффективность распараллеливания около плинтуса, какие то десятки процентов на 2-4 тредах, дальше хуже.
Гонки данных нет (ну я не вижу, код специально писался так что бы ее исключать). Я бы понял если бы в std::unordered_map было какое то статическое поле, тогда OpenMP ведет себя похожим образом. Что просиходит вообще?
Проблема с плохой параллелизацией типичная, но по моему опыту такие достаточно нагруженные циклы параллелятся хорошо. Памяти задача ест относительно немного (1-2 Гб), правда адресуется она достаточно хаотично.
Основная разница в том что тут юзается std::unordered_map c которым я толком дела не имел в параллельных задачах.
Еще один вопрос - есть ли какие то рекомендации по выбору числа бакетов? Я выбрал порядка числа элементов (на два порядка ниже чем диапазон ключей), стало лучше чем по умолчанию. Сейчас еще поиграюсь конечно, но боюсь дело совсем не в этом…
cast bugfixer