ВВЕДЕНИЕ. Современные вычислительные системы включают несколько ядер или процессоров. В их основе лежать сложные и дорогостоящие аппаратные части, такие как L1, L2, L3 уровни кэша, SRAM память.
Но при этом истинная эффективность достигается в правильных методах работы с этими многопоточными средствами. Необходимо учитывать время жизни потока, функционирование кэш линии, ложное разделение кэша (false sharing), стоимость создания потоков - всё это существенно влияет на временную сложность и определяет действительную ценность алгоритма.
Проблемная область. Для точной оценки эффективности необходим в обширный инструментарий и глубокие знания в низкоуровневых механизмах работы. Классические модели, такие как закон Амдала или Густафсона – Барсиса не позволяют с достаточной степенью точности дать оценку времени работы алгоритма. Необходимо учитывать системные вызовы (создание потока, ожидание future), переключение контекста, а также загрузку процессора.
ЦЕЛЬ НАСТОЯЩЕЙ РАБОТЫ. Привести примеры алгоритмов и их асинхронных версий, оценить время работы. Разработать на основании их математическую модели. Реализовать последовательные и параллельные версии алгоритмов, измерить время выполнения для различных размеров данных и числа потоков, сопоставить с теоретическими моделями и сформулировать практические рекомендации.
МАТЕРИАЛ И МЕТОДЫ ИССЛЕДОВАНИЯ. Приведём классические законы, для описания параллельных вычислений:
Закон Амдала (1967) устанавливает предельное ускорение
программы при фиксированном объёме данных:

где
– доля последовательного кода,
раз.
Закон Густафсона (1988) учитывает возможность масштабирования задачи: с ростом числа процессоров увеличивается и размер входных данных. В такой постановке ускорение выражается как:
![]()
однако, данные модели полезны для теоретических оценок, для реальных случаев они не учитывают накладные расходы, и время создания потоков.
В языке C++ при использовании std::async с политикой std::launch::async создаётся новый поток для каждой задачи. Даже на современных системах создание потока занимает 1–2 мкс и требует выделения памяти под стек (обычно 1–8 Мбайт). При мелкой задаче затраты на создание потоков превышают выигрыш от параллельного выполнения.
В качестве примера можно рассмотреть стандартные алгоритмы сортировки.
Базовая последовательная сортировка слиянием (Merge Sort) имеет сложность
Оптимальное значение порога, при котором эффективен однопоточный алгоритм, лежит между 300 до 2000 элементом, а также зависит от типа данных и архитектуры системы.
Для бинарного поиска создание отдельного потока на каждый рекурсивный вызов нецелесообразно из-за логарифмической сложности. Поэтому лучшим решением было разработать отдельный класс пула потоков, который переиспользует фиксированное число потоков. Задачи помещаются в очередь и распределяются между рабочими потоками. Использование класса распределяет задачи между заданным числом потоков, что снижает накладные расходы на создание потоков по сравнению с вызовом std::async для каждой подзадачи.
Математическая модель алгоритмов представлена в следующем виде
Последовательное время сортировки слиянием:
![]()
Параллельное время (приблизительная оценка):

Ускорение:

Для бинарного поиска последовательное время
РЕЗУЛЬТАТЫ И ОБСУЖДЕНИЕ Эксперименты проводились на процессоре Intel Core i7-12700K (14 потоков, 8 физических ядер), частота 3,6 ГГц, ОС Ubuntu 22.04, компилятор g++ 11.3 с ключами -O3 -march=native. Для каждого размера массива и числа потоков выполнялось 10 запусков, результаты усреднены. Размер массива для сортировки выбран
Таблица 1.
Сравнение ускорения сортировки слиянием
|
|
|
|
Реальное ускорение |
Амдал ( |
Густафсон-Барсис |
|
1 |
28,8 |
28,8 |
1,00 |
1,00 |
1,00 |
|
2 |
28,8 |
19,5 |
1,48 |
1,48 |
1,70 |
|
4 |
28,8 |
13,2 |
2,18 |
2,00 |
3,05 |
|
8 |
28,8 |
10,1 |
2,85 |
2,35 |
5,55 |
|
14 |
28,8 |
9,4 |
3,06 |
2,52 |
9,45 |
По результатам тестирования можно наблюдать, что реальное ускорение оценивается примерно в 3,06x при максимальном числе потоков. Для закона Амдала теоретические результаты дают оценку 2,52x и 9.45x для Густафсона – Барсиса, результаты имеют значительно отличаются от теоретических оценок. Параллельный бинарный поиск во всех экспериментах показал ускорение < 1, что делает данную реализацию абсолютно неэффективной.
ВЫВОДЫ. Параллельные алгоритмы эффективны далеко не для всех задач и требуют дополнительного анализа и тщательной разработки. Асинхронный алгоритм сортировки слиянием эффективен при размере входных данных размером более 10000 элементов. Максимальное ускорение составило 3,06× против 1,48× в нескольких потоках. Теоретические оценки не являются точным прогнозом стабильности из-за дополнительных накладных расходов и ресурсов. Бинарный поиск не улучшил свои показатели при многопоточной работе.
ПУТИ ДАЛЬНЕЙШЕГО РАЗВИТИЯ. Необходимо провести дополнительный анализ и разработать адаптивный порог переключения (зависящий также от числа потоков и размера кэш-памяти), необходимо учитывать паттерны доступа к кэш-памяти процессора. Изучить и использовать SIMD-инструкций (AVX2) для ускорения последовательного слияния, осуществить переход на более лёгкие средства параллелизма: std::execution::par (C++17) и std::jthread (C++20), а также провести анализ кэш промахов L3 кэша процессора.
Список литературы
- Williams A. C++ Concurrency in Action, 2nd ed. — Manning Publications, 2019. — 592 p. — ISBN 978-1617294693
- Stroustrup B. The C++ Programming Language, 4th ed. — Addison-Wesley, 2013. — 1347 p. — ISBN 978-0321563842
- Josuttis N. M. The C++ Standard Library: A Tutorial and Reference, 2nd ed. — Addison-Wesley, 2012. — 1120 p. — ISBN 978-0321623218
- Meyers S. Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14. — O'Reilly Media, 2014. — 334 p. — ISBN 978-1491903995
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. 6.В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4
- Левитин А. В. Алгоритмы. Введение в разработку и анализ. — М.: Вильямс, 2006. — 576 с. — ISBN 978-5-8459-0987-9
- Кнут Д. Э. Искусство программирования, том 3: Сортировка и поиск, 3-е изд. — М.: Вильямс, 2020. — 832 с. — ISBN 978-5-8459-1821-5
- Антонов А. Под законом Амдала // Компьютерра. — 11.02.2002. — № 430. — URL: https://www.computerra.ru/2002/430/15838/ (дата обращения: 01.06.2026)
- Gustafson J. L. Reevaluating Amdahl's Law // Communications of the ACM. — 1988. — Vol. 31, No. 5. — P. 532–533. — DOI: 10.1145/42411.42415


