Как суммировать миллион элементов вектора? Как ускорить с помощью многопоточности?

Начните с последовательного суммирования и измерения. Для параллельного варианта разделите вектор на непрерывные диапазоны, считайте локальные суммы и объедините их после завершения.

Короткий ответ

Что ответить на собеседовании

Начните с последовательного суммирования и измерения. Для параллельного варианта разделите вектор на непрерывные диапазоны, считайте локальные суммы и объедините их после завершения.

Подробный разбор

Ответ с пояснениями

Начните с последовательного суммирования и измерения. Для параллельного варианта разделите вектор на непрерывные диапазоны, считайте локальные суммы и объедините их после завершения.

Для vector<int> безопаснее выбрать достаточно широкий аккумулятор, например std::accumulate(v.begin(), v.end(), int64_t{0}), если итог помещается в int64_t. Нулевой аргумент типа int может привести к переполнению даже при присваивании результата в 64-битную переменную.

В многопоточном варианте не обновляйте один атомарный счётчик на каждом элементе: это создаст конкуренцию. Каждый worker суммирует свой диапазон, затем главный поток складывает результаты. Не изменяйте вектор во время чтения.

Миллион элементов может обрабатываться настолько быстро, что создание потоков дороже выигрыша. Используйте существующий пул, контролируйте число workers и измеряйте. Для floating-point изменение порядка сложения меняет округление; битовое совпадение результатов не гарантируется.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее