Начните с последовательного суммирования и измерения. Для параллельного варианта разделите вектор на непрерывные диапазоны, считайте локальные суммы и объедините их после завершения.
Как суммировать миллион элементов вектора? Как ускорить с помощью многопоточности?
Начните с последовательного суммирования и измерения. Для параллельного варианта разделите вектор на непрерывные диапазоны, считайте локальные суммы и объедините их после завершения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Начните с последовательного суммирования и измерения. Для параллельного варианта разделите вектор на непрерывные диапазоны, считайте локальные суммы и объедините их после завершения.
Для vector<int> безопаснее выбрать достаточно широкий аккумулятор, например std::accumulate(v.begin(), v.end(), int64_t{0}), если итог помещается в int64_t. Нулевой аргумент типа int может привести к переполнению даже при присваивании результата в 64-битную переменную.
В многопоточном варианте не обновляйте один атомарный счётчик на каждом элементе: это создаст конкуренцию. Каждый worker суммирует свой диапазон, затем главный поток складывает результаты. Не изменяйте вектор во время чтения.
Миллион элементов может обрабатываться настолько быстро, что создание потоков дороже выигрыша. Используйте существующий пул, контролируйте число workers и измеряйте. Для floating-point изменение порядка сложения меняет округление; битовое совпадение результатов не гарантируется.